美文网首页操作系统
利用局部性原理提高程序性能

利用局部性原理提高程序性能

作者: 修行者12138 | 来源:发表于2024-04-08 22:47 被阅读0次

具有良好局部性的程序,倾向于访问相同的数据,或者访问邻近的数据。

因为第一次访问后,被访问的数据及其邻近的数据(在同一个块里)被缓存了,下次继续访问可以命中缓存

具有良好局部性的程序,倾向于从更高层次的存储结构访问数据。

高层次的存储结构是低层次的存储结构的缓存,层次越高,访问速度越快

image.png image.png

局部性有2种不同的形式

  • 时间局部性: 在一个具有良好时间局部性的程序中,如果一个存储位置被引用了,很可能在不久的将来被再次引用
  • 空间局部性: 在一个具有良好空间局部性的程序中,如果一个存储位置被引用了,很可能在不久的将来引用其附近的存储位置

以二维数组的求和为例,看一下局部性原理对程序性能的影响有多大。
定义一个M*N的二维数组,用两种不同的顺序遍历数组进行求和。

public class TestLocality {

    private static final int M = 2000;

    private static final int N = 3000;

    public static void main(String[] args) {
        int[][] arr = new int[M][N];
        init(arr);

        int testTimes = 10;
        int totalTime1 = 0, totalTime2 = 0;

        for (int i = 0; i < testTimes; i++) {
            long time1 = test1(arr);
            long time2 = test2(arr);
            totalTime1 += time1;
            totalTime2 += time2;
        }

        System.out.println("average time1: " + totalTime1 / testTimes + "ms");
        System.out.println("average time2: " + totalTime2 / testTimes + "ms");
    }

    private static void init(int[][] arr) {
        int num = 0;
        for (int i = 0; i < M; i ++) {
            for (int j = 0; j < N; j++) {
                arr[i][j] = num++;
            }
        }
    }

    /**
     * 按照行顺序扫描
     */
    private static long test1(int[][] arr) {
        long sum = 0;
        long start = System.currentTimeMillis();
        for (int i = 0; i < M; i ++) {
            for (int j = 0; j < N; j++) {
                sum += arr[i][j];
            }
        }
        return System.currentTimeMillis() - start;
    }
    
    /**
     * 按照列顺序扫描
     */
    private static long test2(int[][] arr) {
        long sum = 0;
        long start = System.currentTimeMillis();
        for (int i = 0; i < N; i ++) {
            for (int j = 0; j < M; j++) {
                sum += arr[j][i];
            }
        }
        return System.currentTimeMillis() - start;
    }
}

打印结果

average time1: 4ms
average time2: 47ms

test1方法,按照数组存储顺序进行访问,具有良好的空间局部性,10次运行平均耗时4ms


image.png

test2方法,没有按照数组存储顺序进行访问,不具备良好的空间局部性,10次运行平均耗时47ms


image.png

相关文章

  • 从存储角度提升程序性能

    这篇主要是利用局部性原理优化程序性能,以前也写过一篇优化程序性能,这篇主要是结合perf工具,量化比较程序性能的优...

  • cache原理与映射 - 草稿

    利用的原理:程序访问的局部性原理 (时间访问局部性和空间访问局部性) 解释:时间局部性是指如果程序中的某条指令一旦...

  • 程序局部性原理

    在复习操作系统时遇到了这样的问题 CPU利用程序局部性原理使得高速指令处理和低速内存访问得以匹配从而提高CPU效率...

  • 计算机组成与体系结构知识点二

    局部性原理局部性原理是指在指定的时间内,程序趋于在有限的内存区域内重复访问。通常将局部性分为空间局部性和时间局部性...

  • Mysql高级(九)局部性原理和磁盘预读

    一、局部性原理 局部性原理是指无论程序指令还是数据都趋于聚集在一个较小的连续区域中。 1.1 局部性分类 时间局部...

  • 如何提高C++程序性能

    如何提高程序性能 本文主要探讨提高程序性能的途径、方法和最佳实践。 总体方向 尽可能利用缓存 尽可能利用多核 还有...

  • cache的原理

    cache的工作原理:利用空间局部性和时间局部性原理,通过自有的存储空间,缓存一部分内存的指令和数据,减少cpu访...

  • CPU缓存和内存屏障

    CPU性能优化手段 缓存 运行时指令重排 缓存 为了提高程序运行的性能,处理器大多会利用缓存来提高性能,而避免访问...

  • 39-性能与伸缩性

    性能与伸缩性 使用线程的一种说法是为了提高性能。多线程可以使程序充分利用闲置的资源,提高资源的利用率,同时能够并行...

  • HA Cluster和keepalived主从,主主高可用设置以

    四、简述http协议缓存原理及常用首部讲解 cache:缓存程序的运行具有局部性特征:· 时间局部性:一个数据被访...

网友评论

    本文标题:利用局部性原理提高程序性能

    本文链接:https://www.haomeiwen.com/subject/pygxxjtx.html