2015-01-09 5 views
0
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); 

} 
} 

두 가지 기능은 동일한 알고리즘을 사용하여 화면에 지그재그 보드를 인쇄합니다. 최적화 된 버전에서 k는 다시 계산되지 않도록 배열에 저장되며 2 * m이 추출됩니다. 나는 더 빠르고 정확한 벤치 마크 assert true;-System.out.println()을 변경,하지만 난 벤치 마크를 수행 할 때, 원래 버전은 항상 실행 빠른 enter image description here코드 최적화의 실행 속도가 느려짐 - 필요 설명

+1

을 (http://codereview.stackexchange.com/) –

+0

아마 메모리 액세스는'*'와'%'보다 느린 때문이다. – immibis

+0

... 다시 읽으면 여기에 질문이 표시되지 않습니다. – immibis

답변

1

의 차이를 볼 수 n이 얼마나 큰 (충분히 N 큰 포함)?

n이 너무 크면 배열이 너무 커서 CPU 캐시에 유지할 수 없습니다. j % (2 * m)를 계산 한 다음 RAM (60-100 나노초)에서 액세스하는 것이 빠릅니다.

Scott Mayers - How CPU Cache works and why you care 참조 -이 질문은 [코드 검토]로 이동해야합니다