数组与列表的性能

2024-06-19

假设您需要一个需要频繁迭代的整数列表/数组,我的意思是非常频繁。原因可能有所不同,但可以说它位于大容量处理的最内层循环的核心。

一般来说,人们会选择使用列表(List),因为它们的大小具有灵活性。最重要的是,msdn 文档声称列表在内部使用数组,并且执行速度应该一样快(使用 Reflector 快速查看即可证实这一点)。无论如何,这会涉及一些开销。

有没有人真正测量过这个?在列表中迭代 6M 次会花费与数组相同的时间吗?


非常容易测量...

在少量紧循环处理代码中我知道长度是固定的我使用数组进行额外的微小优化;数组可以是边际地 faster if您使用索引器 / 来表示表单 - 但 IIRC 认为这取决于数组中数据的类型。但除非你need微观优化,保持简单并使用List<T> etc.

当然,这仅适用于您正在读取所有数据的情况;对于基于键的查找,字典会更快。

这是我使用“int”的结果(第二个数字是校验和,以验证它们都做了相同的工作):

(已编辑以修复错误)

List/for: 1971ms (589725196)
Array/for: 1864ms (589725196)
List/foreach: 3054ms (589725196)
Array/foreach: 1860ms (589725196)

基于测试台:

using System;
using System.Collections.Generic;
using System.Diagnostics;
static class Program
{
    static void Main()
    {
        List<int> list = new List<int>(6000000);
        Random rand = new Random(12345);
        for (int i = 0; i < 6000000; i++)
        {
            list.Add(rand.Next(5000));
        }
        int[] arr = list.ToArray();

        int chk = 0;
        Stopwatch watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            int len = list.Count;
            for (int i = 0; i < len; i++)
            {
                chk += list[i];
            }
        }
        watch.Stop();
        Console.WriteLine("List/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk);

        chk = 0;
        watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                chk += arr[i];
            }
        }
        watch.Stop();
        Console.WriteLine("Array/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk);

        chk = 0;
        watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            foreach (int i in list)
            {
                chk += i;
            }
        }
        watch.Stop();
        Console.WriteLine("List/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk);

        chk = 0;
        watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            foreach (int i in arr)
            {
                chk += i;
            }
        }
        watch.Stop();
        Console.WriteLine("Array/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk);

        Console.ReadLine();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组与列表的性能 的相关文章

  • 用 np.savez 存储字典会产生意想不到的结果?

    我可以使用 np savez 存储字典吗 结果令人惊讶 至少对我来说 而且我找不到通过密钥取回数据的方法 In 1 a 0 A array 1 2 3 B array 4 5 6 In 2 a Out 2 0 A array 1 2 3 B
  • 如何使用 Rx 以非阻塞方式观察值?

    我试图在计时器上观察其处理程序比间隔长 为了做到这一点 我想安排对某种线程池 任务池或其他东西的观察 我尝试了线程池 任务池和newthread 但没有一个起作用 有谁知道该怎么做 例子 var disposable Observable
  • 递归分层父子

    我有一个来自数据库的项目集合 该数据库具有parentid值或空 这是我的班级设计 public class Item public int id get set public string Name get set public int
  • 静态解构器

    我在 Web 服务中实例化了类 该服务在静态成员中保留了一些资源 如果我不是静态地持有这些资源 我可能会通过一些 IDisposable 对象访问它们 我可以在 Dispose 上释放资源 无论保留此会话是否是一个好主意 NET 是否提供了
  • 如何在 Perl 中生成数组的所有排列?

    生成所有内容的最佳 优雅 简单 高效 方式是什么 n perl 中数组的排列 例如 如果我有一个数组 arr 0 1 2 我想输出所有排列 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0 它可能应该是一个返回迭代器的
  • 有人可以解释一下以下内存分配 C 程序的性能行为吗?

    在我的机器上 时间 A 和时间 B 交换取决于是否A是 定义或未定义 这会改变两个的顺序 callocs 被称为 我最初将此归因于寻呼系统 奇怪的是 当mmap被用来代替calloc 情况更加奇怪 两个循环花费的时间相同 正如预期的那样 作
  • 在python中接受用空格分隔的多个用户输入并将它们附加到列表中

    如何接受以空格分隔的多个用户输入 我不知道输入的数量 但我知道它们都是整数 以下是一些输入示例 13213 412 8143 12 312 1321 142 9421 9 29 319 我知道如果我事先知道输入的数量就可以做到这一点 但我在
  • 打印 WPF 位图图像

    打印位图图像的最佳方法是什么 我有 System Drawing 背景 所以我正在考虑将其转换为位图 然后打印它 但我认为可能有更好的方法 Thanks 根据 Drew 的回答 最好测量并安排传递给 PrintVisual 方法的容器 这将
  • DownloadProgressChangedEventHandler 多久被调用一次

    我正在使用 Webclient 异步下载文件 我想知道多久一次 DownloadProgressChangedEventHandler 被调用吗 用户可以控制吗 以下内容适用于完整的 NET Framework 因为您的问题被标记为 ASP
  • Java:使用泛型实现对不同类型数字进行操作的类

    所以 假设我想编写一个对不同类型的数字进行操作的类 但我事先并不知道我将要对哪种数字 即整数 双精度数等 进行操作 我想使用泛型为这种情况创建一个通用类 就像是 Adder
  • 如何重置 MS Access 中的身份列

    我有一个 Windows 应用程序连接到MS Access 2007数据库 已有300多条记录Customer Table 我已经删除了所有记录 但插入新记录后CustomerID回报301 但我想将其设置为1 我尝试了以下查询 ALter
  • 循环结束后从头开始重新迭代 for 循环 - JS

    我有一个数组和一个对象数组 我基本上需要将数组的第一个元素映射到数组内对象的第一个元素 依此类推 两个数组的长度都可以是可变的 并且一旦循环结束 循环应该从头开始 但是 我不确定是否再次开始循环 这是我的代码 const colors 7c
  • .NET:为什么不检查枚举的范围/值?

    这一直困扰着我 也许对 NET 内部结构有一定了解的人可以向我解释一下 假设我定义一个枚举如下 public enum Foo Eenie 1 Meenie 2 Miney 3 Moe 4 现在 还假设我的代码中的某处有以下代码 int b
  • 是否有 .NET API 可以返回给定路径的等效扩展路径字符串?

    在 NTFS 中 我可以在路径前加上前缀 字符序列 表示它是超过 260 个字符限制的路径 因此 文件系统将正确解释路径并避免引发PathTooLongException see http msdn microsoft com en us
  • 如何在聚合框架中按位置修改数组中的值

    假设有一个简单的文档 array a b c d 如何修改second值在聚合 With update这很简单 db collection updateOne set array 1 B gives array a B c d 在聚合框架中
  • JavaScript 在对象中创建数组并将数据推送到数组

    我是编程新手 我正在尝试 React 并具有函数 addComment 当用户向新闻添加评论时执行该函数 此时我需要创建一个属性comments 数组 并分配或推送到该数组输入评论值价值 但现在我只重写了数组的 0 个元素 无法添加新元素
  • 有什么方法可以在 ASP.NET MVC Web 应用程序中模拟声明主体吗?

    我有一些ASP NET MVC控制器代码检查用户是否经过身份验证 如果是 则检查用户是否具有特定声明 工作正常 我有一些单元测试 我需要模拟一个IPrincipal 这很容易做到 但我不知道如何检查索赔 我通常会做类似的事情 public
  • 元组/数组列表对

    我本质上是想创建一个配对列表 事实证明这是非常困难的 请注意 在任何人提到哈希表之前 都会有我不关心的重复项 例如 如果我这样做 b dog cat I get Name Value dog cat 这很好 但是 我无法添加类似的内容 b
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • EntLib5:登录应用程序块未记录到事件日志(例外:无法构造 LogWriter 类型)-任何人都可以帮忙吗?

    你好呀 我刚刚设置了 Enterprise Library 5 的日志记录应用程序块部分 我认为我已经完成了正确的操作 但它没有记录到事件日志 它在写入方法上出错并给出了以下异常 The type LogWriter cannot be c

随机推荐

  • RxJ 从 observable 中获取价值

    在组件中 singleEvent Observable
  • Ember-cli 夹具加载

    我确信我错过了一些小而愚蠢的东西 但似乎无法加载我的装置 这是我有 应用程序 模型 todos js import DS from ember data var Todo DS Model extend title DS attr stri
  • 在 Windows 中使用 PHP 创建受密码保护的 Zip 文件

    我正在 PHP 中创建给定文件的 zip 文件 下面是函数 function create zip file file name zip new ZipArchive zip name file name zip Zip name zip
  • SVN 提交后挂钩在提交后不会运行

    我的服务器上设置了 SVN 存储库 并且遇到提交后问题 我在 iMac 上使用 SmartSVN 作为客户端 我通过 SmartSVN 的 ssh svn 连接 我能够成功连接到 SVN 并对其进行更改 但从 SVN 客户端提交后 我的提交
  • 将 url 参数获取到 asp.net 标签中

    我试图自动将 asp label 的文本设置为 url 参数 但它似乎不起作用 这是我的代码
  • 响应式 CSS 图像锚点标签 - 图像地图样式

    我一直在开发一个响应式网站 并且在图像映射方面遇到了一些问题 图像映射似乎不适用于基于百分比的坐标 经过一番谷歌搜索后 我发现了一个 JS 解决方法 http mattstow com experiment responsive image
  • 枚举类型在打字稿中给出双数组

    我想从枚举数据类型创建一个下拉列表 但是当我尝试将枚举更改为具有名称和值的对象时 枚举数组返回枚举成员的两倍 使用函数这个帖子 https stackoverflow com questions 18111657 how does one
  • 为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

    我想要实现的目标类似于棋盘游戏 有一个100 100的网格 放在一个Item它驻留在一个Flickable 游戏板 的各个矩形都是 svg 图像 目前大约有 20 种 可能会增加到数百种 作为基准测试 我只是尝试用元素填充 世界 Compo
  • Google Cloud Console 免费试用期满后恢复虚拟机实例

    我已经搜索了我的问题 但很惊讶没有找到答案 因为这一定是相当常见的情况 我的谷歌云控制台免费试用版大约两个月前就过期了 而我却没有意识到 我现在已升级到付费帐户 但我的 Wordpress VM 实例不再存在 事实上 没有虚拟机实例 Goo
  • 如何将 Gradle 脚本插件变成二进制插件

    我有一堆像这样的 gradle 脚本插件https github com docToolchain docToolchain blob master scripts exportExcel gradle https github com d
  • F# 查询,按单列对多个值进行分组

    我有一个 F sql 查询 需要对每组中的两列求和 let financials query for data in dbData do groupValBy data earning data losses data store into
  • 使用AndroidKeyStore身份验证的无限循环

    当我使用需要用户身份验证才能使用密钥的 AndroidKeyStore 时 我的应用程序进入无限循环 setUserAuthenticationRequired true setUserAuthenticationValidityDurat
  • 如何在codeigniter中插入具有多个单选名称的单选按钮值?

    我正在尝试使用 codeigniter 进行在线测验 其中有一个针对某些主题的动态测验 用户可以在每个问题中添加问题和多项选择答案 我如何获得每个问题的每个多项选择答案中每个答案的值 p p
  • 在C中重新分配结构

    我是 C 新手 正在尝试结构 创建结构后 是否可以用大括号重新分配它 typedef struct int height int age Person int main void Person bill 100 35 bill 120 34
  • 检索线索广告 Facebook API

    我在检索潜在客户广告时遇到问题 我有广告 ID 和页面 ID 我没有创建它们 但被添加为开发人员 我试图使用 PHP SDK 和这个https developers facebook com docs marketing api guide
  • 如何把父母和孩子联系起来?

    有两个简单的类 一个只有parent属性 并且两者兼而有之parent and children属性 这意味着同时具备两者的人parent and children继承自唯一的parent 这是只有parent属性 我们就这样称呼它吧Chi
  • 处理 SwiftUI 视图中的可选值/nil 值 - 在 SwiftUI 中使用 if let [重复]

    这个问题在这里已经有答案了 视图通常不允许可选参数值 从而导致类似的错误Initializer init requires that String conform to StringProtocol struct Person var na
  • SQL 2008全文索引填充延迟

    我的经理说 在基础表数据更改后 可能需要一段时间才能更新全文搜索索引 例如 如果我有一张桌子Products有一个柱子Description我更新了该描述 然后我可能需要一些时间才能搜索该新描述 真的吗 这需要多长时间 SQL 2008 对
  • 打包 Perl 应用程序,以便它可以在 Perl 的默认前缀之外工作

    我正在使用 Module Build 尽管我在构建环境上很灵活 来打包我正在编写的一些 Perl 软件 供我工作的内部使用 它包括一些脚本和一些辅助模块 我的计划是这样你就可以指定任何你想要的前缀 即perl默认值之外的东西 INC 在构建
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组