zoukankan      html  css  js  c++  java
  • 代码优化点--程序的局部性

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

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

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

    时间局部性示例

    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,空间局部性极差。





  • 相关阅读:
    IDEA中用好Lombok,撸码效率至少提升5倍
    在 IDEA 中使用 Debug,真是太厉害了!
    彻底理解cookie,session,token
    优秀的程序员一定要多写博客!
    IntelliJ IDEA 从入门到上瘾教程,2019图文版!
    注解配置
    过滤器(登录认证)
    过滤器
    Session监听器
    request监听器
  • 原文地址:https://www.cnblogs.com/bigman-bugman/p/14101050.html
Copyright © 2011-2022 走看看