程序性能优化-局部性原理

简介: 程序性能优化-局部性原理

更多文章

概念

一个编写良好的计算机程序常常具有良好的局部性,它们倾向于引用最近引用过的数据项附近的数据项,或者最近引用过的数据项本身,这种倾向性,被称为局部性原理。有良好局部性的程序比局部性差的程序运行得更快。

局部性通常有两种不同的形式:

  • 时间局部性:在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来被多次引用。
  • 空间局部性 :在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。

时间局部性示例

function sum(arry) {
    let i, sum = 0
    let len = arry.length
    for (i = 0; i < len; i++) {
        sum += arry[i]
    }
    return sum
}

在这个例子中,变量sum在每次循环迭代中被引用一次,因此,对于sum来说,具有良好的时间局部性

空间局部性示例

具有良好空间局部性的程序

// 二维数组 
function sum1(arry, rows, cols) {
    let i, j, sum = 0
    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            sum += arry[i][j]
        }
    }
    return sum
}

空间局部性差的程序

// 二维数组 
function sum2(arry, rows, cols) {
    let i, j, sum = 0
    for (j = 0; j < cols; j++) {
        for (i = 0; i < rows; i++) {
            sum += arry[i][j]
        }
    }
    return sum
}

看一下上面的两个空间局部性示例,像示例中从每行开始按顺序访问数组每个元素的方式,称为具有步长为1的引用模式。

如果在数组中,每隔k个元素进行访问,就称为步长为k的引用模式。

一般而言,随着步长的增加,空间局部性下降。

这两个例子有什么区别?区别在于第一个示例是按行扫描数组,每扫描完一行再去扫下一行;第二个示例是按列来扫描数组,扫完一行中的一个元素,马上就去扫下一行中的同一列元素。

数组在内存中是按照行顺序来存放的,结果就是逐行扫描数组的示例得到了步长为 1 引用模式,具有良好的空间局部性;而另一个示例步长为 rows,空间局部性极差。

性能测试

运行环境:

  • cpu: i5-7400
  • 浏览器: chrome 70.0.3538.110

对一个长度为9000的二维数组(子数组长度也为9000)进行10次空间局部性测试,时间(毫秒)取平均值,结果如下:

所用示例为上述两个空间局部性示例

步长为 1 步长为 9000
124 2316

从以上测试结果来看,步长为 1 的数组执行时间比步长为 9000 的数组快了一个数量级。

总结:

  • 重复引用相同变量的程序具有良好的时间局部性
  • 对于具有步长为 k 的引用模式的程序,步长越小,空间局部性越好;而在内存中以大步长跳来跳去的程序空间局部性会很差

参考资料:

目录
相关文章
|
3月前
|
存储 人工智能 算法
探究现代操作系统的架构与性能优化
本文将深入探讨现代操作系统的核心架构,并重点分析其性能优化的关键策略。我们将从宏观和微观两个角度出发,解释操作系统的基本组成部分及其相互作用,并通过具体实例展示如何通过各种技术手段提升系统性能。无论是软件开发者还是计算机专业的学生,都能从中受益,获得对操作系统更深层次的理解。
|
4月前
|
JavaScript
hyengine 编译问题之性能优化瓶颈如何解决
hyengine 编译问题之性能优化瓶颈如何解决
|
7月前
|
缓存 编译器 调度
【C/C++ 性能优化】了解cpu 从而进行C++ 高效编程
【C/C++ 性能优化】了解cpu 从而进行C++ 高效编程
379 0
|
运维 监控 Java
35-JVM性能优化总结-JVM性能优化到底该怎么做?
通过之前大量的案例和工具的介绍,相信大家对于JVM优化有了一定的了解和熟悉,接下来我们将整个JVM性能优化的步骤做一个总结。
202 0
|
7月前
|
缓存 小程序 前端开发
小程序 如何做性能优化?
小程序 如何做性能优化?
|
机器学习/深度学习 缓存 Linux
很底层的性能优化:让CPU更快地执行你的代码
很底层的性能优化:让CPU更快地执行你的代码
|
存储 缓存 NoSQL
Linux内存性能优化总结,让你的系统更加高效!(下)
Linux内存性能优化总结,让你的系统更加高效!
|
存储 缓存 Linux
Linux内存性能优化总结,让你的系统更加高效!(上)
Linux内存性能优化总结,让你的系统更加高效!
|
前端开发
一次性能优化思考过程
最近业务上空闲了下来,也是把之前在开发时自身感受比较大的白屏时间放在了主线上去排查优化,这里记录一下笔者对于移动端vConsole脚本的引入问题全过程。
167 0
一次性能优化思考过程
|
程序员
【编程】程序的局部性原理对代码效率的影响
【编程】程序的局部性原理对代码效率的影响
141 0