一个常见的编程问题: 遍历同样大小的数组和链表, 哪个比较快? 如果按照大学教科书上的算法分析方法,你会得出结论,这2者一样快, 因为时间复杂度都是 O(n)。 但是在实践中, 这2者却有极大的差异。   通过下面的分析你会发现, 其实数组比链表要快很多。
首先介绍一个概念:memory hierarchy (存储层次结构),电脑中存在多种不同的存储器,如下表
CPU 寄存器 – immediate access (0-1个CPU时钟周期) 
CPU L1 缓存  – fast access (3个CPU时钟周期) 
CPU L2 缓存 – slightly slower access (10个CPU时钟周期) 
内存 (RAM)   – slow access (100个CPU时钟周期) 
硬盘 (file system) – very slow (10,000,000个CPU时钟周期) 
      (数据来自 http://www.answers.com/topic/locality-of-reference)
各级别的存储器速度差异非常大,CPU寄存器速度是内存速度的100倍! 这就是为什么CPU产商发明了CPU缓存。 而这个CPU缓存,就是数组和链表的区别的关键所在。
CPU缓存会把一片连续的内存空间读入, 因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面, 平均读取每个元素的时间只要3个CPU时钟周期。   而链表的节点是分散在堆空间里面的,这时候CPU缓存帮不上忙,只能是去读取内存,平均读取时间需要100个CPU时钟周期。 这样算下来,数组访问的速度比链表快33倍! (这里只是介绍概念,具体的数字因CPU而异)
因此,程序中尽量使用连续的数据结构,这样可以充分发挥CPU缓存的威力。 这种对缓存友好的算法称为 Cache-oblivious algorithm, 有兴趣可以参考相关资料。再举一个简单例子:
对比
for i in 0..n
  for j in 0..m
    for k in 0..p
      C[i][j] = C[i][j] + A[i][k] * B[k][j];
for i in 0..n
for k in 0..p
    for j in 0..m
      C[i][j] = C[i][j] + A[i][k] * B[k][j];
虽然两者执行结果一样,算法复杂度也一样,但是你会发现第二种写法要快很多。
总结一下, 各种存储器的速度差异很大,在编程中绝对有必要考虑这个因素。 比如,内存速度比硬盘快1万倍,所以程序中应该尽量避免频繁的硬盘读写;CPU缓存比内存快几十倍,在程序中尽量多加利用。
本文转自 陈本峰 51CTO博客,原文链接:http://blog.51cto.com/wingeek/274006,如需转载请自行联系原作者

[编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表相关推荐

  1. 应用程序性能瓶颈中的CPU缓存优化

    1.前言 在应用程序中会有大量的对变量的操作,在一般情况下不会导致问题,但在多线程操作共享变量时,不当的操作会产生大量的冗余操作,造成性能的浪费.这篇文章主要从编码方式与逻辑策略对变量从CPU寄存器, ...

  2. Java并发编程(六):从CPU缓存一致性协议到JMM(Java内存模型)

    注:本系列主要注重并发编程这块儿,JVM内容很多,会另外开专栏总结,此系列可能只是会稍微提及 一.跨平台和JVM 经过前面几篇博文的介绍,我们知道,任何编程语言编写的程序要想被计算机执行,都必须被翻译 ...

  3. php cpu缓存 执行 代码,缓存PHP页面的代码,可以减轻CPU和MYSQL负担

    /* * 名称: 极光缓存 * * 作者: DCD * mail: haodan-_-b@163.com * * web开发群: 3574636 * http://www.525ok.com * * ...

  4. linux编译对cpu要求,Linux系统中使用GCC CPU参数优化代码编译

    使用特定的GCC参数可以使编译出的程序执行效率有较大提升.具体如下: 1.优化原理: 在编译程序时,借助参数传递的方法,使用与系统CPU相匹配的gcc参数,编译出的程序就是为系统CPU而进行特定优化过 ...

  5. [编程技巧] C++字符串初始化的优化写法

    C++中,有很多种字符串变量初始化方式,最常见的写法是: WCHAR szBuffer[128] = {0};  或者 WCHAR szBuffer[128] = L""; 其实这 ...

  6. 【Linux 内核 内存管理】优化内存屏障 ① ( barrier 优化屏障 | 编译器优化 | CPU 执行优化 | 优化屏障源码 barrier 宏 )

    文章目录 一.优化屏障 ( 编译器优化 | CPU 执行优化 ) 二.优化屏障源码 一.优化屏障 ( 编译器优化 | CPU 执行优化 ) " 代码 " 编译成 " 可执 ...

  7. 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程

    许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...

  8. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM

    文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...

  9. CPU CACHE优化 性能优化方法和技巧

    转载来源:性能优化方法和技巧 系列目录 性能优化方法和技巧 性能优化的方法和技巧:概述 性能优化的方法和技巧:代码 性能优化的方法和技巧:工具 这是一个可以用一本书来讲的话题,用一系列博客来讲,可能会 ...

最新文章

  1. 调查:台湾上班族讨厌5种年会状况 最怕老板致词长
  2. 英伟达吞并Arm失败!英美欧盟一齐干涉,老黄还要给孙正义12.5亿美元分手费
  3. Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常?
  4. python的__slots__
  5. ZStack源码剖析之核心库鉴赏——Defer
  6. 【项目管理】项目管理发展的新阶段——PRINCE2项目管理方法
  7. 从B站源码里探索推荐算法的奥义
  8. 自动跳动滑动门html,jQuery 滑动门自动滑动实现代码
  9. using eclipse to write c programe
  10. STM32CUDE-STM32F407学习笔记2-按键操作
  11. C# 通过Http获取网页内容
  12. Jenkins批量删除历史构建记录
  13. 什么是DOM0,DOM2,DOM3?
  14. 开了店铺没访客没流量?Shopee店铺日常运营引流方式来啦
  15. 希腊字母发音对照表及其latex命令
  16. 关于git中,两个branch自动同步的问题和解决
  17. css立体3d效果动画,css3 实现动画,变换基点及3D效果~
  18. 卡尔曼滤波算法的代码验证
  19. MySQL JDBC 客户端反序列化漏洞分析
  20. 点击pv转化率_点击转化率缩写

热门文章

  1. 淘宝旺铺基础版装修出专业版效果(不花钱也一样做到)
  2. mysql,int(5)、int(10)啥区别联系
  3. 使用NSCondition实现多线程同步
  4. Deep Belief Network简介
  5. POJ-2195 Going Home 最小权值匹配
  6. 【转】POWER MANAGEMENT IN IEEE 802.11
  7. 基于Lucene查询原理分析Elasticsearch的性能
  8. bootstrap框架中data-xxx 的属性
  9. SQLServer错误:过程 sp_addextendedproperty,第 xxx 行对象无效。'dbo.xxx.xxx' 不允许有扩展属性,或对象不存在。...
  10. “中国式招标”的一些趣闻