https://www.cnblogs.com/yeungchie/

先说结论:cons > tconc, lconc >> nconc > append1, append

append1

let((a)
ycTime(
for(i 1 fix(3e4)
a = append1(a i)
)
)
length(a)
)
; UserTime : 12.108453s
; SysTime : 0.000000s
; WallClock : 12.104178s
; 30000

append

let((a)
ycTime(
for(i 1 fix(3e4)
a = append(a list(i))
)
)
length(a)
)
; UserTime : 13.654966s
; SysTime : 0.000000s
; WallClock : 13.651223s
; 30000

append1, append 这两个函数操作写链表速度奇慢,因为它每次追加元素都需要把整个链表遍历一次。

唯一的好处就是对初学者友好,容易理解和使用,因此在知道数据量不大的前提下,才去使用这两个函数吧。

nconc

let((a)
ycTime(
for(i 1 fix(3e4)
a = nconc(a list(i))
)
)
length(a)
)
; UserTime : 2.995670s
; SysTime : 0.000000s
; WallClock : 2.994434s
; 30000

相比 append 快了一点,但也没有快很多,毕竟只追加 30000 次。

它对于输入变量是具有破坏性的,会直接修改变量,而不像 append 在底层会将数据进行拷贝,因此会快一些,更省内存。

tconc

let((a)
ycTime(
for(i 1 fix(3e4)
a = tconc(a i)
)
a = car(a)
)
length(a)
)
; UserTime : 0.001871s
; SysTime : 0.000000s
; WallClock : 0.001871s
; 30000

tconc 会保留链表中最后一个节点,当追加列表时直接操作该节点,因此不需要反复遍历整个链表。car 指向我们期望的链表。

在上面的情况下,相比 append 快了近 5000 倍,已经没有可比性了,所以后面函数把追加次数调整为 60000000 来比较。

let((a)
ycTime(
for(i 1 fix(6e7)
a = tconc(a i)
)
a = car(a)
)
length(a)
)
; UserTime : 4.085272s
; SysTime : 0.000189s
; WallClock : 4.083197s
; 60000000

lconc

let((a)
ycTime(
for(i 1 fix(6e7)
a = lconc(a list(i))
)
a = car(a)
)
length(a)
)
; UserTime : 4.741206s
; SysTime : 0.000000s
; WallClock : 4.740194s
; 60000000

两者区别在于,tconc 拼接的是一个标量,lconc 拼接的是一个链表。

速度相差不大,看情况来使用吧。

cons

let((a)
ycTime(
for(i 1 fix(6e7)
a = cons(i a)
)
)
length(a)
)
; UserTime : 1.865164s
; SysTime : 0.000000s
; WallClock : 1.865343s
; 60000000

这个函数又快不少,它是将元素追加到链表开头,因此不需要遍历元素,也不需要记忆节点。

由于是向前追加,元素顺序可能会跟我们期望的相反,这时候就需要降链表翻转一下,看看速度。

let((a)
ycTime(
for(i 1 fix(6e7)
a = cons(i a)
)
a = reverse(a)
)
length(a)
)
; UserTime : 3.655040s
; SysTime : 0.000000s
; WallClock : 3.649090s
; 60000000

翻转增加了一点耗时,速度跟 tconclconc 差不多。

[ Skill ] append1, append, nconc, tconc, lconc, cons 效率对比的更多相关文章

  1. python中列表的insert和append的效率对比

    python中insert和append方法都可以向列表中插入数据只不过append默认插入列表的末尾,insert可以指定位置插入元素. 我们来测试一下他俩插入数据的效率: 测试同时对一个列表进行插 ...

  2. Snapman系统中TCC执行效率和C#执行效率对比

    Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面4方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 4.MD5算法 这是C ...

  3. 进程and线程and协程效率对比

    1.进程与进程池的效率对比 多进程:p.start()过程中,只是向操作系统发送一个信号,至于什么时候执行,都是操作系统的事情,操作系统接收到信号时,帮该进程申请一块内存空间+拷贝父进程的地址空间 # ...

  4. string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比

    关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了.关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):1.使用Insert与Forma ...

  5. FileInputStream 与 BufferedInputStream 效率对比

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3550158.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  6. java中多种写文件方式的效率对比实验

    一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...

  7. golang 浮点数 取精度的效率对比

    需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" " ...

  8. SIMD---SSE系列及效率对比

    SSE(即Streaming SIMD Extension),是对由MMX指令集引进的SIMD模型的扩展.我们知道MMX有两个明显的缺点: 只能操作整数. 不能与浮点数同时运行(MMX使用FPU寄存器 ...

  9. 查询最新记录的sql语句效率对比

    在工作中,我们经常需要检索出最新条数据,能够实现该功能的sql语句很多,下面列举三个进行效率对比 本次实验的数据表中有55万条数据,以myql为例: 方式1: SELECT * FROM t_devi ...

  10. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

随机推荐

  1. Golang之文件系统事件监听

    Golang之文件系统事件监听 基本介绍 文件系统事件是指文件系统相关的各种操作和状态变化,当一个应用层的进程操作文件或目录时,会触发system call,内核的notification子系统可以守 ...

  2. java调用百度地图接口输入名称查经度纬度

    如何注册ak号请参考https://blog.csdn.net/weixin_42512684/article/details/115843299 package manager.tool; impo ...

  3. 深入理解dom加载过程

  4. 引发C++异常的常见原因(一)从报错地址到错误症状

    在进行C++软件开发的过程中,会遇到很多问题,网上差不到,或者查到了也没什么信息可以用,所以这里想到了就将一些常见的问题放在一起,归纳整理一下. 本文主要的内容来源于CSDN的大佬文章:https:/ ...

  5. java基础-数组-day06

    1. 引入数组 录入10个学生的成绩 求和 求平均 import java.util.Scanner; public class TestArray01{ public static void mai ...

  6. idea 配置 service 服务,多模块同时启动

    转载请注明出处: 1,打开IDEA项目 .idea 下 的workspace.xml 2,查找"RunDashboard" 节点 3,添加如下内容 <option name= ...

  7. 基于java+springboot的外卖点餐网站、外卖点餐管理系统

    该系统是基于java+springboot开发的外卖点餐网站.外卖点餐管理系统.是给师弟开发的课程作业.运行过程中的问题,可以在github咨询作者. 演示地址 前台地址: http://food.g ...

  8. 使用华为路由连接WiFi,被限制网速?

    1.问题 使用华为路由连接WiFi,但是网速非常慢,经常半天才能加载一个界面? 2.解决方法 登陆http://192.168.3.1/网址,发现限速一栏被框选,取消即可

  9. CSS - 滤镜的妙用 - 制作炫彩圆环(外加动画)

    效果图如下: 话不多说,上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  10. CSS - checkbox 样式

    .checkbox-wrap{ position:relative } .checkbox-wrap::before{ content: ''; position: absolute; top: 31 ...