【译】AS3利用CPU缓存
利用CPU缓存
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缓存相关推荐
- 如何高效的利用CPU缓存
CPU缓存 我们知道CPU的缓存一般是由三级缓存构成,缓存离CPU越近,CPU访问缓存的速度就越快.如下图所示,每个核心都有自己的一.二级缓存,但三级缓存却是一颗 CPU 上所有核心共享的:程序执行时 ...
- CPU 缓存如何影响你的 Go 程序性能
小菜刀最近在medium上阅读了一篇高赞文章<Go and CPU Caches>,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d ...
- CPU缓存体系对Go程序的影响
小菜刀最近在medium上阅读了一篇高赞文章<Go and CPU Caches>,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d ...
- 内存对齐与CPU缓存
公司有小伙伴提出了类似的问题, 根据自己的思路,整理了一下相关的内容,做了一期分享. 目录 一.内存分页/分段管理.内存对齐 1.前置知识点 2.内存分页.分段 4.何为内存对齐 5.为何要有内存对齐 ...
- [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
一个常见的编程问题: 遍历同样大小的数组和链表, 哪个比较快? 如果按照大学教科书上的算法分析方法,你会得出结论,这2者一样快, 因为时间复杂度都是 O(n). 但是在实践中, 这2者却有极大的差异. ...
- CPU缓存和内存屏障
CPU性能优化手段-缓存 为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化. 例如:CPU高速缓存.尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能. ...
- CPU Cache Line:CPU缓存行/缓存块
<CPU Cache Line伪共享问题的总结和分析> 以下文章来源于小林coding ,作者小林coding Table of Contents CPU Cache 有多快? CPU C ...
- CPU与内存的中转站 ——了解CPU缓存的秘密
转载自 青原的日记 Cache,在现在对大多数DIYer来说都是再熟悉不过的词了,特别是谈论到CPU的时候,不得不提的就是Cache,并且Cache已经与频率一样,成为衡量CPU性能最重要的参数之一了 ...
- CPU缓存一致性协议
一.CPU的一些基本组成 在提到CPU缓存这个问题前,先来回顾一下CPU的组成部分,及其作用.早期CPU由运 ...
- CPU缓存命中率和缓存行详解
冯诺依曼计算机 早期的冯诺依曼计算机,大抵功能和工作流程如下: 输入设备接收用户输入的指令信息 数据到达到达运算器,运算器将需要的指令存入存储器中 控制器从存储器中捞数据和指令进行计算再给运算器进行计 ...
最新文章
- 一种解决启动进程传递参数过长的方法
- jquery的四层联动插件jquerySelect
- 第三次软工作业——实现最大字段和算法并进行判定条件覆盖
- 导入代码时eclipse的src目录变为包名
- Mind Master Pro 8.0——安装教程
- ssh中的相对路径与绝对路径的问题
- 中小企业CRM评测-八百客
- the code place where the binding is converted to final value displayed in ui
- 中科大计算机是一流学科吗,2016安徽省大学一流学科排行榜,中科大第一
- 应用层下的人脸识别(三):人脸比对
- 测试点击屏幕次数的软件_红蜘蛛5校色仪怎么用?显示器校色及测试色域和色彩精准度详细教程...
- Linux下用脚本命令打开文档、表格、PPT
- 咬住爱的甜蜜 像夹心巧克力 连懒懒的猫咪 也偷偷看你 难以抗拒你的美丽 裙摆摇不停 只为了与你相遇
- Linux IPTABLES 防火墙专题讲座 - 上篇-龙小威-专题视频课程
- 笔试面试经历----上海爱立信
- linux-块设备简单总结
- SymbianOS精要
- 微课录制软件哪个好用?微课制作方法分享
- android短信验证码代码,Android短信验证码自动填写实现代码
- python接口自动化测试的两种思路