一个操作让数组处理速度快了5倍,到底是为什么

这篇具有很好参考价值的文章主要介绍了一个操作让数组处理速度快了5倍,到底是为什么。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一个操作让数组处理速度快了5倍,到底是为什么

 

概述:通过对数组进行排序,代码更好地利用了缓存,从而提高了程序的性能。这种现象通常被称为"缓存友好"(cache-friendly)或"空间局部性"(spatial locality)

今天做一个数组数据计算时,发现一个效率问题,给大家分享一下 一个数组排序和不排序时同样的逻辑处理速度是不一样的。排序后速度快了近5倍,上图:

一个操作让数组处理速度快了5倍,到底是为什么

 

  1. 再来说明原因:

这段代码之所以在排序后运行更快,是因为它利用了现代计算机体系结构中的一个优化:CPU缓存。

在主循环中,对data数组的访问是顺序的,即按照数组元素的顺序依次访问。在没有排序的情况下,由于数组的内存布局是随机的,这可能导致对内存的随机访问,而这种随机访问可能导致较多的缓存缺失(cache misses)。

而在经过排序之后,数组的元素被重新排列,使得相邻元素的值更加接近。这就意味着在主循环中,对数组的访问会更加连续,这有助于提高缓存的命中率(cache hit rate)。高缓存命中率意味着CPU可以更快地获取数据,而不必等待缓慢的主内存。这对于循环中的迭代非常重要,因为它会不断地访问数组的不同部分。

通过对数组进行排序,代码更好地利用了缓存,从而提高了程序的性能。这种现象通常被称为"缓存友好"(cache-friendly)或"空间局部性"(spatial locality)。

  1. 然后来看看实际测试代码,不排序测试:
        static void Main()
        {
            double elapsedTime = Test1();
            double elapsedTime2 = Test2();

            Console.WriteLine($"排序前后:Test1/Test2={(double)(elapsedTime / elapsedTime2)}");
            Console.ReadKey();
        }

        /// <summary>
        /// 不排序测试
        /// </summary>
        static double Test1()
        {
            // 生成数据
            const int arraySize = 32768;
            int[] data = new int[arraySize];
            Random rand = new Random();

            for (int c = 0; c < arraySize; ++c)
                data[c] = rand.Next(256);  // 生成0-255的随机数

            // 测试
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            long sum = 0;
            for (int i = 0; i < 100000; ++i)
            {
                for (int c = 0; c < arraySize; ++c)
                {   // 主循环
                    if (data[c] >= 128)
                        sum += data[c];  // 如果数据大于等于128,则加到总和中
                }
            }

            stopwatch.Stop();
            double elapsedTime = stopwatch.ElapsedMilliseconds;  // 计算所花费的时间

            Console.WriteLine($"不排序效果:用时{elapsedTime}毫秒");  // 输出所花费的时间
            Console.WriteLine("sum = " + sum);  // 输出总和
            Console.WriteLine();
            return elapsedTime;
        }
  1. 排序后的测试代码:
        /// <summary>
        /// 排序测试
        /// </summary>
        /// <returns></returns>
        static double Test2()
        {
            // 生成数据
            const int arraySize = 32768;
            int[] data = new int[arraySize];
            Random rand = new Random();

            for (int c = 0; c < arraySize; ++c)
                data[c] = rand.Next(256);  // 生成0-255的随机数


            double elapsedTime = 0;
            // 测试
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            // 对数据进行排序,这样下一个循环会运行得更快
            Array.Sort(data);
            stopwatch.Stop();
            elapsedTime = stopwatch.ElapsedMilliseconds;  // 计算所花费的时间
            stopwatch.Restart();

            long sum = 0;
            for (int i = 0; i < 100000; ++i)
            {
                for (int c = 0; c < arraySize; ++c)
                {   // 主循环
                    if (data[c] >= 128)
                        sum += data[c];  // 如果数据大于等于128,则加到总和中
                }
            }

            stopwatch.Stop();
            double elapsedTime2 = stopwatch.ElapsedMilliseconds;  // 计算所花费的时间

            double elapsedTime3 = (elapsedTime + elapsedTime2);

            Console.WriteLine($"排序后效果:排序用时{elapsedTime}毫秒,计算用时:{elapsedTime2}毫秒,合计用时:{(elapsedTime3)}毫秒");  // 输出所花费的时间
            Console.WriteLine("sum = " + sum);  // 输出总和
            Console.WriteLine();

            return elapsedTime3;
        }

大家在Java、C++、Python是不是也遇到过类似的问题。

源代码获取:https://pan.baidu.com/s/1vm6faDdFFGFEmvpLMPATcQ?pwd=6666 

 

一个操作让数组处理速度快了5倍,到底是为什么文章来源地址https://www.toymoban.com/news/detail-842972.html

到了这里,关于一个操作让数组处理速度快了5倍,到底是为什么的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云3M固定带宽是什么意思?速度快吗?

    阿里云服务器3M固定带宽是什么意思?速度快吗?3M固定带宽是指云服务器的公网带宽,用于在外网提供服务的,3M带宽的下载速度是384KB/秒,上传速度是1280KB/秒 ,对于个人博客或流量不多的企业官网速度还是挺快的,阿里云服务器网aliyunfuwuqi.com如果是Web网站应用,网站如果

    2024年02月03日
    浏览(28)
  • 我把Solon打包成了native image,速度快的惊人

    Solon 一个高效的应用开发框架:更快、更小、更简单。https://solon.noear.org/ 我刚开始对 Solon 感兴趣的原因,就是启动快、包体积小,用了一段时间之后,发现 Solon 使用 GraalVM native iamge 打包有一些问题,我把问题发到 Solon 用户群里,作者告诉我 Solon 的原生编译还 beat 阶段,只

    2023年04月27日
    浏览(29)
  • 并行环境让采样速度快两个量级:Isaac Gym提速强化学习

    仿真环境的 采样速度慢 ,是强化学习的一个瓶颈。例如,论文中常用的 MuJoCo 环境,台式机或服务器的 CPU 上运行仿真环境,一小时大概采集十万或百万步(1e5 或 1e6 步);训练一个智能体(收敛后)需要十多个小时。 加快仿真环境的采样速度,通常有以下方法: 增加并行

    2024年02月16日
    浏览(34)
  • 分享三个转换速度快、准确率高的视频转文字工具

    想要直接将视频转换成文字,转换工具很重要!给大家分享三个转换速度快、准确率高的视频转文字工具,轻松完成转换。 1.网易见外 https://sight.youdao.com/ 网易家的智能转写翻译服务工作站,网页端就可以直接使用,支持视频翻译、转写,语音翻译、转写,会议同传、文档翻

    2024年04月26日
    浏览(26)
  • 记录--记录用前端代替后端生成zip的过程,速度快了 57 倍!!!

    业务场景: 产品有个功能是设置主题。类似手机自动切换壁纸,以及其他功能颜色,icon,字体等。 管理员需要在后端管理系统多次下载不同主题,(至于要干啥就不说了...),主题中可能有 30 ~ 100个高清壁纸, icon 等。现在每次下载主题(31张高清图片)至少需要 10s。有什么

    2024年02月08日
    浏览(30)
  • yolov8 瑞芯微 RKNN 的 C++部署,部署工程难度小、模型推理速度快

       之前写过两次yolov8目标检测部署,后续继续思考,针对部署还有优化空间,本示例的部署方式优化了部署难度,加快了模型推理速度(略微增加了后处理的时耗)。 特别说明:如有侵权告知删除,谢谢。 【完整代码】代码和模型    onnx转rknn模型这一步就不再赘述,请

    2024年01月23日
    浏览(30)
  • yolov8n 瑞芯微RKNN和地平线Horizon芯片仿真测试部署,部署工程难度小、模型推理速度快

      特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。   模型和完整仿真测试代码,放在github上参考链接 模型和代码。   因为之前写了几篇yolov8模型部署的博文,存在两个问题:部署难度大、模型推理速度慢。该篇解

    2024年02月01日
    浏览(37)
  • yolov8n 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

      特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。   模型和完整仿真测试代码,放在github上参考链接 模型和代码。   因为之前写了几篇yolov8模型部署的博文,存在两个问题:部署难度大、模型推理速度慢。该篇解

    2024年01月16日
    浏览(51)
  • Redis的速度不够用?为什么你应该考虑使用 KeyDB,一个更快、更强大、更灵活的开源数据库

    你是否正在使用 Redis 作为您的数据结构存储,享受它的高性能、高可用的特性?如果是这样,那么你可能会对 KeyDB 感兴趣。 KeyDB 一个由 Snap 提供支持、专为扩展而构建的开源数据库。它是 Redis 的高性能分支,专注于多线程、内存效率和高吞吐量。KeyDB 采用 MVCC 体系

    2024年02月08日
    浏览(53)
  • 微信小程序 通过setData 给两个变量设置同一个数组时,为什么修改一个变量,另一个会也被修改?

    在微信小程序中,使用 setData 方法更新数据时,如果给两个变量设置同一个数组,修改其中一个变量的值会导致另一个变量也被修改的原因是,数组是引用类型的数据,在内存中的存储方式是按引用地址存储。 当你将一个数组赋值给两个变量时,实际上两个变量共享同一块内

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包