利用CPU缓存

计算机有随机存取存储器RAM(译注:即我们常说的内存),但有更快形式的存储器。如果你希望你的应用程序的快速运行,你需要知道这些其他的存储器。今天的文章中讨论了它们,并给出了两个AS3例子,即使有这样的高级语言,你仍然可以利用它们。

RAM的确很快,但只是与硬盘,固态硬盘,光盘,互联网等等与比较时。RAM与CPU内置的高速缓存相比,它并不快。你可能已经听说过他们,CPU高速缓存的级别分别称为:L1,L2和L3。

CPU高速缓存用来存储小块的RAM内容。当RAM被请求时,可以使用更快的高速缓存,而不是...但只有当所请求的RAM是在高速缓存中的。这就是所谓的高速缓存“命中”。如果高速缓存“miss”,CPU需要从较慢的RAM来获取。

CPU的高速缓存策略各不相同,但RAM连续块通常存储在缓存中(译注:因为程序运行时对内存的访问呈现局部性(Locality)特征。这种局部性既包括空间局部性(Spatial Locality),也包括时间局部性(Temporal Locality)。有效利用这种局部性,缓存可以达到极高的命中率。不清楚的可以回去补下课)。这意味着,如果你的应用程序的工作在连续的内存块(如一个Vector)上并且大小不超过高速缓存大小限制,那么CPU高速缓存将被命中,而不是从RAM中读取,将收获一个大的性能取胜。

用一个有点做作的例子来证明这一点,访问一个大Vector中所有的元素模拟RAM。分别顺序访问,随机访问它们。为了消除Math.random调用的影响,通过2个Vector来存储访问元素的索引值。在随机访问的情况下,Vector中存的索引值是随机的,这样元素将被随机读取。下面是10个元素的向量的例子,两个索引值Vector可能如下所示:

/ /顺序访问(索引Vector中存储的index值)

0 1 2 3 4 5 6 7 8 9

/ /随机访问(索引Vector中存储的index值)

2 3 9 1 4 0 6 8 5 7

测试运行的环境:

Release version of Flash Player 12.0.0.41

2.3 Ghz Intel Core i7-3615QM (256 KB L2 per core, 6 MB L3 cache)

Mac OS X 10.9.1

Google Chrome 32.0.1700.77

ASC 2.0.0 build 354071 (-debug=false -verbose-stacktraces=false -inline -optimize=true)

测试得到的结如下:

访问方式

耗时

顺序

27

随机

169

由此我们可以看到使用了CPU缓存的顺序访问,比没有使用CPU缓存的随机访问性能高6+倍。访问内存的顺序真的很重要!

诚然上面的例子有点做作,但下面的例子是处理实际问题:遍历BitmapData的像素。需要一个循环来遍历行(Y),一个循环来遍历列(X)。哪个作为外循环,哪个作为内循环?

实际上,BitmapData是“逐行”存储的。下面是3x2 BitmapData:

(0,0) (1,0) (2,0) (0,1) (1,1) (1,2)

如果外循环是遍历列(X),访问这些内存的地址如下:

0 4 8 1 5 9 2 6 10 3 7 11

但是如果外循环是遍历行(Y),访问顺序如下:

0 1 2 3 4 5 6 7 8 9 10 11

正如我们上面所了解到,顺序访问可以利用CPU缓存。似乎只是跳序了一点点,但是当BitmapData实例很大的时候问题开始真正出现。如果BitmapData为2048×2,前四个内存访问将是0,2047,1,2048。

下面的例子比较了2048×2048的BitmapData这两种循环策略,测试环境与上面的相同:

BITMAPDATA外循环

耗时

89

348

这里的性能优势不像上面访问Vector那么大,但遍历相同的像素时它仍然是高达4倍的优势。如果BitmapData是更大的,优势只会更大。这在CPU的缓存比我的测试环境中少的情况更明显。

下面是测试应用程序的源代码:

Code

 

运行测试程序(http://files.jacksondunstan.com/articles/2491/CacheTest.swf)。

原文链接:http://jacksondunstan.com/articles/2491

转载于:https://www.cnblogs.com/skynet/p/3547380.html

【译】AS3利用CPU缓存相关推荐

  1. 如何高效的利用CPU缓存

    CPU缓存 我们知道CPU的缓存一般是由三级缓存构成,缓存离CPU越近,CPU访问缓存的速度就越快.如下图所示,每个核心都有自己的一.二级缓存,但三级缓存却是一颗 CPU 上所有核心共享的:程序执行时 ...

  2. CPU 缓存如何影响你的 Go 程序性能

    小菜刀最近在medium上阅读了一篇高赞文章<Go and CPU Caches>,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d ...

  3. CPU缓存体系对Go程序的影响

    小菜刀最近在medium上阅读了一篇高赞文章<Go and CPU Caches>,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d ...

  4. 内存对齐与CPU缓存

    公司有小伙伴提出了类似的问题, 根据自己的思路,整理了一下相关的内容,做了一期分享. 目录 一.内存分页/分段管理.内存对齐 1.前置知识点 2.内存分页.分段 4.何为内存对齐 5.为何要有内存对齐 ...

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

    一个常见的编程问题: 遍历同样大小的数组和链表, 哪个比较快? 如果按照大学教科书上的算法分析方法,你会得出结论,这2者一样快, 因为时间复杂度都是 O(n). 但是在实践中, 这2者却有极大的差异. ...

  6. CPU缓存和内存屏障

    CPU性能优化手段-缓存 为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化. 例如:CPU高速缓存.尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能. ...

  7. CPU Cache Line:CPU缓存行/缓存块

    <CPU Cache Line伪共享问题的总结和分析> 以下文章来源于小林coding ,作者小林coding Table of Contents CPU Cache 有多快? CPU C ...

  8. CPU与内存的中转站 ——了解CPU缓存的秘密

    转载自 青原的日记 Cache,在现在对大多数DIYer来说都是再熟悉不过的词了,特别是谈论到CPU的时候,不得不提的就是Cache,并且Cache已经与频率一样,成为衡量CPU性能最重要的参数之一了 ...

  9. CPU缓存一致性协议

                                                  一.CPU的一些基本组成 在提到CPU缓存这个问题前,先来回顾一下CPU的组成部分,及其作用.早期CPU由运 ...

  10. CPU缓存命中率和缓存行详解

    冯诺依曼计算机 早期的冯诺依曼计算机,大抵功能和工作流程如下: 输入设备接收用户输入的指令信息 数据到达到达运算器,运算器将需要的指令存入存储器中 控制器从存储器中捞数据和指令进行计算再给运算器进行计 ...

最新文章

  1. 一种解决启动进程传递参数过长的方法
  2. jquery的四层联动插件jquerySelect
  3. 第三次软工作业——实现最大字段和算法并进行判定条件覆盖
  4. 导入代码时eclipse的src目录变为包名
  5. Mind Master Pro 8.0——安装教程
  6. ssh中的相对路径与绝对路径的问题
  7. 中小企业CRM评测-八百客
  8. the code place where the binding is converted to final value displayed in ui
  9. 中科大计算机是一流学科吗,2016安徽省大学一流学科排行榜,中科大第一
  10. 应用层下的人脸识别(三):人脸比对
  11. 测试点击屏幕次数的软件_红蜘蛛5校色仪怎么用?显示器校色及测试色域和色彩精准度详细教程...
  12. Linux下用脚本命令打开文档、表格、PPT
  13. 咬住爱的甜蜜 像夹心巧克力 连懒懒的猫咪 也偷偷看你 难以抗拒你的美丽 裙摆摇不停 只为了与你相遇
  14. Linux IPTABLES 防火墙专题讲座 - 上篇-龙小威-专题视频课程
  15. 笔试面试经历----上海爱立信
  16. linux-块设备简单总结
  17. SymbianOS精要
  18. 微课录制软件哪个好用?微课制作方法分享
  19. android短信验证码代码,Android短信验证码自动填写实现代码
  20. python接口自动化测试的两种思路

热门文章

  1. SciPy教程 - 常数constants和特殊函数库special
  2. java加按钮_用java写一个简单的学生信息管理系统
  3. 力扣-387 字符串中的第一个唯一字符
  4. Kotlin — 适用于 Web 开发
  5. 适合户外显示中玩耍的游戏
  6. SHELL脚本项目实例(一)
  7. 安装java项目开发环境
  8. 关于BSTR数据类型
  9. Web调取摄像头拍照
  10. 使用yum update更新文件系统时不更新内核的方法