최적화주기에 대한 성능

머리말

for 루프는 컬렉션의 배열 탐색과 같은 구문의 일반적인 개발의 하나이지만, 에너지 손실의 새로운 문제가 많이있을 것입니다하지 않을 경우, 일반적으로 루프 최적화 문제에 대한의 성능을 설명하기 위해 오늘을 사용했다.

  1. 중첩 루프
    중첩 루프 직접 부호의 설명은 다음 두 층 또는 함께 루프 중첩의 2 층 이상이다.
  • 외부 크기 내에서 중첩 :
   /**
     * 大循环驱动小循环(即外大内小)
     */
    private static void bigSmall() {
        long stratTime = System.nanoTime();
        for (int i = 0; i < 10000000; i++) {
            for (int j = 0; j < 100; j++) {

            }
        }
        long endTime = System.nanoTime();
        System.out.println("外大内小耗时:" + (endTime - stratTime));
    }

결과에 시간이 걸리는 모양을 수행합니다 :

外大内小耗时:8743800

많은 시간이 소요되는 경우 마이너 봐

  • 중첩 된 외부 작은 대형
    /**
     * 小循环驱动大循环(即外小内大)
     */
    private static void smallBig() {
        long stratTime = System.nanoTime();
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 10000000; j++) {

            }
        }
        long endTime = System.nanoTime();
        System.out.println("外小内大耗时:" + (endTime - stratTime));
    }

결과에 시간이 걸리는 모양을 수행합니다 :

外小内大耗时:6922600

음, 두 사람의 전체 실행 시간을 비교, 시간 차이는 여전히 매우 크다.

마이너이 소요되는 대형 : 6,922,600; 작은 시간이 소요 내에 대형 외부 : 8743800

요약 :

위의 비교에서 크게 성능을 최적화. 사이클의 번호가 변경되지 않았지만 중첩 루프는 원칙적으로 "큰에서 마이너"를 따라야하지만 많은 시간이 오래 걸립니다. 당신은 전체 크기가 변경되지 않았습니다하지만, 작은 파일 여러 큰 파일을 복사하는 사이에 차이가 많이 복사,하지만 빠르게 여러 개의 작은 파일보다 훨씬 큰 파일을 복사 한 것입니다.

  1. 루프 변수 인스턴스
  • 루프의 루프 변수의 예 :
    /**
     * 循环变量放在循环内
     */
    private static void smallBigBetterTwo() {
        long stratTime = System.nanoTime();
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 10000000; j++) {

            }
        }
        long endTime = System.nanoTime();
        System.out.println("循环内变量耗时:" + (endTime - stratTime));
    }

시간이 많이 소요 :

循环内变量耗时:4934500
  • 루프의 외부 루프의 변수의 예 :
    /**
     * 循环变量放在循环外
     */
    private static void smallBigBetter() {
        long stratTime = System.nanoTime();
        int i, j;
        for (i = 0; i < 100; i++) {
            for (j = 0; j < 10000000; j++) {

            }
        }
        long endTime = System.nanoTime();
        System.out.println("循环外变量耗时:" + (endTime - stratTime));
    }

시간이 많이 소요 :

循环外变量耗时:5013800

내부 루프와 외부 루프 소요되는 반면에 변수를 비교하여, 우리는 시간 차이가 여전히 큰지고 있음을 발견 :

루프 변수 가공 : 4,934,500; 외부 루프 변수 가공 : 5,013,800

분석 요약 :

효과를 최적화하는 것은 분명 아니지만, 사이클의 수가 증가함에 따라, 점점 더 많은 시간이 소요되는 더 명백 할 것이다 효과를 최적화하는 것입니다 동안. 분석 : 두 번 밖에 최적화 최적화 인스턴스화 1 + I = 101 회, 전. 요약 : 루프 변수가 인스턴스화 루프 외부에 배치되어야한다.

  1. 추출 및주기 독립적 인 표현
  • 독립적 인 표현 추출물 없습니다
    /**
     * 未提取无关的表达式
     */
    private static void calculationInner() {
        int a = 3;
        int b = 7;
        long stratTime = System.nanoTime();
        for (int i = 0; i < 10000000; i++) {
            i = i * a * b;
        }
        long endTime = System.nanoTime();
        System.out.println("未提取耗时:" + (endTime - stratTime));

    }

더 많은 시간이 소요 추출하지 :

未提取耗时:800
  • 추출 된 독립적 인 표현
    /**
     * 提取无关的表达式
     */
    private static void calculationOuter() {
        int a = 3;
        int b = 7;
        int c = a * b;
        long stratTime = System.nanoTime();
        for (int i = 0; i < 10000000; i++) {
            i = i * c;
        }
        long endTime = System.nanoTime();
        System.out.println("已提取耗时:" + (endTime - stratTime));
    }

추출 된 표현은 시간을 소모 할 수 없다 :

已提取耗时:500

분석 요약 :

이 밖에 배치되어야하므로없이 순환 A * B 코드는 이중 카운트를 방지한다. 분석 이론적 관점에서, 최적의 성능은 높은되도록, 연산량을 줄일 수 있기 때문이다.

  1. 루프 판정 통화를 종료 할 때 방법을 제거
stratTime = System.nanoTime();
for (int i = 0; i < list.size(); i++) { 

}
endTime = System.nanoTime();
System.out.println("未优化list耗时:"+(endTime - stratTime));

시간 :

더 많은 시간이 소요 최적화 목록 없습니다 : 253800

최적화 후

stratTime = System.nanoTime();
int size = list.size();
for (int i = 0; i < size; i++) { 

}
endTime = System.nanoTime();
System.out.println("优化list耗时:"+(endTime - stratTime));

시간 :

소비 최적화 목록 : 142,500

분석 요약 :

각각의 사이클은,는 list.size () 의심의 여지가 루프 밖으로 넣어해야하므로, 프로그램의 성능에 영향을 미치는 크기를 캐시 변수를 사용하는, 한 번 실행됩니다,하지 않는 우리가 너무 많이 소비하는 코드의이 조금 성능을 제공합니다.

  1. 예외 트랩
  • 캐치 예외 내 :
/**
     * 在内部捕获异常
     */
    private static void catchInner() {
        long stratTime = System.nanoTime();
        for (int i = 0; i < 10000000; i++) {
            try {
            } catch (Exception e) {
            }
        }
        long endTime = System.nanoTime();
        System.out.println("在内部捕获异常耗时:" + (endTime - stratTime));
    }

시간이 많이 소요 :

많은 시간이 소요 내부 캐치 예외가 : 3,352,700

  • 외부 캐치 예외의 경우 :
    /**
     * 在外部捕获异常
     */
    private static void catchOuter() {
        long stratTime = System.nanoTime();
        try {
            for (int i = 0; i < 10000000; i++) {
            }
        } catch (Exception e) {

        }
        long endTime = System.nanoTime();
        System.out.println("在外部捕获异常耗时:" + (endTime - stratTime));
    }

시간이 많이 소요 :

외부 촬영에서 이상 시간이 걸리는 : 2,893,600를

분석 요약 :

캐치 예외는 매우 리소스를 많이 사용하기 때문에 내부 루프에 캐치를 시도하지 않는, 최적화 된 성능은 크기 향상의 몇 가지 주문을 가지고있다. 또한, "효과적인 자바"책에 대한-각각의 단순성과 예방의 버그 측면에서 루프 타의 추종을 불허하는 장점에 대한 전통을 가지고 있으며, 성능의 손실이없는 루프의 전통에 우선 루프, 따라서 권장 지적 - 각주기.

요약 :
이 일반적으로 그들이 당신에게 도움이 느끼는 경우에, 거기에 작은 붉은 마음을 방해하지 않는 곳을 알고 있어야 순환의 필요성에 사용됩니다.

게시 54 개 원래 기사 · 원 찬양 (153) ·은 50000 +를 볼

추천

출처blog.csdn.net/ljx1400052550/article/details/104037172