当数组更快时,为什么要使用列表?

Seequ

我注意到数组的执行速度比Haxe的链表(至少在cpp上)快得多。我得到的结果如下。

Main.hx:40: With 1 items, Array is 14% faster than List.
Main.hx:40: With 5 items, Array is 58% faster than List.
Main.hx:40: With 10 items, Array is 59% faster than List.
Main.hx:40: With 100 items, Array is 54% faster than List.
Main.hx:40: With 1000 items, Array is 56% faster than List.
Main.hx:40: With 10000 items, Array is 55% faster than List.
Main.hx:40: With 100000 items, Array is 52% faster than List.

这让我震惊。即使必须连续在项目周围进行复制,Array怎么能这么快?那为什么还要使用列表呢?

package tests;

import haxe.Timer;

class Main 
{

    static function main() 
    {
        var arr:Array<Int> = new Array();
        var list:List<Int> = new List();
        var result = new List();

        for (items in [1, 5, 10, 100, 1000, 10000, 100000]) {
            var listtime = timeit(10000, function() {
                for (i in 0...items)
                    list.add(i);
                for (x in list)
                    result.add(x);
                result.clear();
                list = new List();
            });

            var arrtime = timeit(10000, function() {
                for (i in 0...items)
                    arr.push(i);
                for (x in arr)
                    result.add(x);
                result.clear();
                arr = new Array();
            });

            if (arrtime < listtime)
                trace('With $items items, Array is ${Std.int((1-arrtime/listtime)*100)}% faster than List.');
            else
                trace('With $items items, List is ${Std.int((1-listtime/arrtime)*100)}% faster than Array.');
        }
    }

    static public function timeit<T>(times:Int, f:Void -> T):Float {
        var start = Timer.stamp();
        for (i in 0...times) {
            f();
        }
        var time = Timer.stamp() - start;
        return time;
    }

}
埃雷里卡

即使必须连续在项目周围进行复制,Array怎么能这么快?

数组用于线性处理的速度更快,因为数组内容连续存储在内存中。线性访问内存时,多个对象会同时提取到处理器缓存中。另一方面,链接列表节点分散在整个内存中,因此,对其进行线性处理会导致主内存中出现更多访问权限。读取缓存比读取主内存快得多。

那为什么还要使用列表呢?

使用链表的一个主要原因是,插入新元素或删除现有元素不会使对链表中其他元素的引用(包括迭代器和指针)无效。数组不能有这种保证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当MethodHandle更快时,为什么要使用反射来访问类成员?

为什么要使用列表进行导航?

为什么要使用zsh数组参数?

RestTemplate GET对象列表 - 为什么要使用ParameterizedTypeReference代替对象数组?

为什么要使用链接列表而不是数组或向量实现来实现堆栈或队列?

将通用列表转换为数组。为什么需要使用克隆?

为什么在F#中处理数组比列表更快

PHP - 当我可以通过 $_File 数组获取它时为什么要使用 pathinfo

为什么要使用数组类型而不是标准数组?

“ for(;;)”比“ while(TRUE)”更快吗?如果没有,人们为什么要使用它?

为什么要使用列表作为导航菜单?

使用 tkinter 时,为什么要使用“间接”回调?

为什么要使用二维结构数组?

为什么要使用迭代器而不是数组索引?

为什么要使用地图制作新数组

为什么需要使用Java Reflection创建数组元素

在JavaScript中返回时为什么要使用括号?

范围反转时为什么要使用range_iterator?

通过ajax提交时为什么要使用表单标签?

拥有WebView时为什么要使用ImageView?

在记录python时为什么要使用注释?

通过AJAX上传文件时,为什么要使用FormData?

当显示缓慢时,为什么要使用本机反应

当您拥有componentDidUpdate时,为什么要使用getDerivedStateFromProps?

为什么在使用shebang时需要使文件可执行?

为什么删除重载时需要使用声明

当我想在Python / Pandas中获取字符串列表的元素时,为什么需要使用.str?

当我只能定义一个可变长度数组时,为什么要使用malloc()?

为什么要使用ivar?