代码优化导致执行速度变慢 - 需要解释

时间:2015-01-09 06:51:48

标签: java optimization micro-optimization

public class Zigzag{
    public static void zigzag_optimizated(int n, int m) {
        int length = 2*m;
        int localIndex[] = new int[n];
        for(int i = 0; i<n; i++){
            localIndex[i] = i % length;
        }
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j < n; j++) {
                if (localIndex[j]==i || localIndex[j] == length-i)
                   assert true;
                    //  System.out.print('*');
                else
                    assert true;
                    //System.out.print('-');
            }
            //System.out.println();
            assert true;
        }
    }
    public static void zigzag(int n, int m) {
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j < n; j++) {
                int k = j % (2*m);
                char c = '-';
                if (k==i || k == 2*m-i) c = '*';
                assert true;
                //System.out.print(c);
            }
            assert true;
            //System.out.println();
        }
    }
    public static void main(String args[]){
        final int n = 5000000;
        long start =  System.nanoTime();
        zigzag(n, n);
        long time = System.nanoTime() - start;
        long start2 =  System.nanoTime();
        zigzag_optimizated(n, n);
        long time2 = System.nanoTime() - start2;
        System.out.println();
        System.out.println("Time1:" + time);
        System.out.println("Time2:" + time2);

}
}

两个功能具有相同的算法,它将Z字形板打印到屏幕上。 在优化版本中,k保存在数组中以避免重新计算,提取2 * m。 我将System.out.println()更改为assert true;以获得更快,更准确的基准测试,但是当我执行基准测试时,原始版本总是运行得更快(n足够大) enter image description here

1 个答案:

答案 0 :(得分:1)

看到差异有多大?

如果n足够大,则阵列太大而无法将其保存在CPU缓存中 - 计算j%(2 * m)然后从RAM(60-100 nanosec)访问它会更快。

请参阅 Scott Mayers - How CPU Cache works and why you care -