编程:如何通过了解CPU缓存级别来提高应用程序性能

CPU高速缓存是计算机的中央处理单元(CPU)使用的硬件高速缓存,用于降低从主内存访问数据的平均成本。 高速缓存是更小,更快的内存,更接近处理器核心,它存储来自频繁使用的主内存位置的数据副本。 大多数CPU具有不同的独立高速缓存,包括指令和数据高速缓存,其中数据高速缓存通常组织为更多高速缓存级别的层次结构。

CPU缓存级别:

L1快取

L1缓存驻留在每个内核中。 它是最快的可访问内存。 L1缓存分为以下两种类型:

指令缓存 -存储可执行指令,从而使指令提取操作更快。

数据缓存 -存储要处理的数据,以加快数据获取操作。

L2快取

L2高速缓存比L1高速缓存更大且更慢。 它位于核心或主板中。 最新的Intel Core处理器将L2缓存与L1缓存集成到内核中。

三级缓存

它是最大的缓存,位于核心外部。 访问L3高速缓存的速度比L2高速缓存慢,因为它更大,并且处理器必须搜索L3高速缓存中的所有可用数据。

英特尔®酷睿™i7–4770S处理器
英特尔®酷睿™i7–4770S处理器内部裸片照片

在英特尔®酷睿™i7-4770S处理器中,L1缓存和L2缓存被集成到内核中,而L3缓存则驻留在处理器中。

命中率和未命中率
从高速缓存成功获取称为命中率。
从缓存中获取失败的情况称为未命中率。

如果处理器在L1高速缓存中找不到所需的内容,那么这就是L1高速缓存的未命中率。 然后,处理器前进到L2高速缓存并查找数据。 如果有可用数据,则处理器将使用它,或者处理器将前进到L3进行数据查找。

同样,如果数据在

CPU缓存对编程的影响

考虑下面的C#代码

上面的代码以两种方式处理某个字符串。 它必须执行以下操作,

  1. 在给定的循环计数时间内,将给定的字符串追加到字符串生成器。
  2. 方法“ GetStringByCombinedExecution ”在同一循环中将字符串追加到两个字符串生成器,并显示以毫秒为单位的时间。
  3. 方法“ GetStringBySeperateExecution ”在不同的循环中将字符串追加到两个字符串生成器中,并打印以毫秒为单位的时间。

让我们将loopCount的值设置为10,下面是结果。 它表明组合执行比单独执行更快。

让我们将loopCount的值设置为100,下面是结果。 现在给出不同结果的数字,现在单独执行的速度更快。

让我们将loopCount的值设置为1000,下面是结果。 单独执行更快。

让我们将loopCount的值设置为10000,下面是结果。 单独执行的速度提高了10毫秒。

发生了什么? 为什么数字只是通过分割执行而有所不同?
由于CPU缓存。

在组合执行的情况下,两个字符串生成器对象在L1高速缓存中可能并非始终可用。 因此,它会增加未命中率,而命中率将下降,这将导致处理器花费更多的CPU周期来完成操作。

尽管执行是单独执行的,但命中率很高,因为该过程仅在字符串生成器的单个实例上发生,因此可在L1缓存中使用。 因此,处理器能够以更少的CPU周期完成操作。

结论:

循环是不可避免的,必须在日常编程中实现 。 最近,我在工作中进行了性能优化。 从中了解到,与PoC相比,我的应用程序的效率非常低。 我在应用程序中所做的唯一更改是,我在同一循环中使用不同的对象执行了更多操作。 因此,经过长时间的研究和分析,我开始将操作分成多个单独的循环,实际上在我们的应用程序中极大地提高了性能。 将所有操作拆分为单独的循环后,我们从10秒降至200毫秒,这触发了我写这篇文章的过程。

From: https://hackernoon.com/programming-how-to-improve-application-performance-by-understanding-the-cpu-cache-levels-df0e87b70c90

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值