《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.11 高速缓存的性能

简介: 虽然全面讨论高速缓存的性能超出了本书的范围,但还是可以做以下一些观察。首先,高速缓存的性能不仅取决于高速缓存的设计,而且取决于应用程序的引用模式。因此,必须谨慎地通过测试基准程序来判定高速缓存的性能以及一般化测试结果。

本节书摘来自异步社区《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》一书中的第2章,第2.11节,作者:【美】Curt Schimmel著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.11 高速缓存的性能

虽然全面讨论高速缓存的性能超出了本书的范围,但还是可以做以下一些观察。首先,高速缓存的性能不仅取决于高速缓存的设计,而且取决于应用程序的引用模式。因此,必须谨慎地通过测试基准程序来判定高速缓存的性能以及一般化测试结果。虽然很容易编写一个获得100%命中率的基准程序,但是把它们运用到实际应用中的时候,这样的结果是毫无意义的。例如,下面的程序会获得100%的高速缓存命中率:

while (1)
   ;

循环执行一次之后,所有的指令引用都会在高速缓存中命中。相反,下面的代码片段给一个数组中的每个元素都乘以常数c,因而会得到相当低的高速缓存命中率(假定数组要比高速缓存大)。

for ( j=0; j < YMAX; j++)
     for ( i=0; i < XMAX; i++)
        matrix[i][j] *= c;

因为在C语言中,数组是按行来保存的,在使用高速缓存的时候,如果数组中一行的大小超过了高速缓存行的长度(假定一开始数组没有被高速缓存),那么每次执行最里面的语句就会出现一次缺失。这样的情形尤其糟糕,因为行很长的高速缓存会读取大量从来都不会用到的数据。互换两层for循环会因为空间局部性而提高性能。即使每个元素只读取一次,高速缓存每次都要读取整整一行的事实也意味着引用连续的元素可能会产生一次命中。例外的情况是那些行很小的高速缓存,像MIPS R2000/R3000,它们的每个高速缓存行只有4字节。如果数组matrix的每个元素也是4字节,那么就没有空间局部性的好处了。

即使高速缓存的性能是依赖于应用的,在直觉上还是可以有下面的结论(虽然对于所有应用来说,它们并不一定都对,但是对于包括典型UNIX命令在内的许多应用来说,它们都是正确的)。首先,写回策略比写直通策略更可取,因为程序一般会因为时间局部性而多次修改变量。即使它们没有多次修改变量,写回高速缓存机制也往往不会增加任何性能开销,因为写直通一行或者在以后替换行的时候再写回都要花费一个存储器周期。为每一行维护一个修改位并处理写回虽然增加了复杂性,但这样做是值得的。在最差的情况下,没有时间或者空间局部性可言,有写分配能力的写回策略只会多读一次高速缓存行。完全没有局部性的情形是非常少见的,所以它们不会对性能造成明显的影响。

接下来,增加组的大小一般也会有帮助。对于小规模的高速缓存(1 KB或者更小)来说这样的做法特别有用,因为即便多个地址产生了相同的索引,它也能利用更多的高速缓存。对于非常大的高速缓存(1 MB或者更多)来说,增加组的大小就没那么重要了,因为随着行数的增加,出现一段数据替换现有的高速缓存数据的可能性也逐渐减小。

由于空间局部性,增加高速缓存行的大小一般也会对高速缓存性能有帮助。高速缓存行太长的缺点是在缺失处理期间读取数据需要开销。在小规模高速缓存的组织结构中找不到很长的高速缓存行,因为这就意味着高速缓存中的行数会更少。因此出现替换的频率就更高了。

高速缓存的性能也会受到操作系统的影响。不同的高速缓存组织结构需要不同情况的冲洗机制。有若干种技术可以用来减少必须发生的冲洗量。这很重要,因为频繁的冲洗很花时间,并且减少了有用的数据被高速缓存的时间。

相关文章
|
2月前
|
缓存 监控 前端开发
在资源加载优化中,如何利用浏览器缓存提升性能?
通过以上这些方法,可以有效地利用浏览器缓存来提升资源加载的性能,减少网络请求次数,提高用户体验和应用的响应速度。同时,需要根据具体的应用场景和资源特点进行灵活调整和优化,以达到最佳的效果。此外,随着技术的不断发展和变化,还需要持续关注和学习新的缓存优化方法和策略。
99 53
|
8天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
13天前
|
存储 缓存 负载均衡
从零到一:分布式缓存技术初探
分布式缓存通过将数据存储在多个节点上,利用负载均衡算法提高访问速度、降低数据库负载并增强系统可用性。常见产品有Redis、Memcached等。其优势包括性能扩展、高可用性、负载均衡和容错性,适用于页面缓存、应用对象缓存、状态缓存、并行处理、事件处理及极限事务处理等多种场景。
36 1
|
5月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
2月前
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
110 7
|
3月前
|
存储 缓存 数据库
缓存技术有哪些应用场景呢
【10月更文挑战第19天】缓存技术有哪些应用场景呢
|
3月前
|
存储 缓存 运维
缓存技术有哪些优缺点呢
【10月更文挑战第19天】缓存技术有哪些优缺点呢
|
4月前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
206 15
|
3月前
|
缓存 JavaScript 前端开发
Vue 3的事件监听缓存如何优化性能?
【10月更文挑战第5天】随着前端应用复杂度的增加,性能优化变得至关重要。Vue 3 通过引入事件监听缓存等新特性提升了应用性能。本文通过具体示例介绍这一特性,解释其工作原理及如何利用它优化性能。与 Vue 2 相比,Vue 3 可在首次渲染时注册事件监听器并在后续渲染时重用,避免重复注册导致的资源浪费和潜在内存泄漏问题。通过使用 `watchEffect` 或 `watch` 监听状态变化并更新监听器,进一步提升应用性能。事件监听缓存有助于减少浏览器负担,特别在大型应用中效果显著,使应用更加流畅和响应迅速。
115 1
|
4月前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
82 2