머리말
for 루프는 컬렉션의 배열 탐색과 같은 구문의 일반적인 개발의 하나이지만, 에너지 손실의 새로운 문제가 많이있을 것입니다하지 않을 경우, 일반적으로 루프 최적화 문제에 대한의 성능을 설명하기 위해 오늘을 사용했다.
- 중첩 루프
중첩 루프 직접 부호의 설명은 다음 두 층 또는 함께 루프 중첩의 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
요약 :
위의 비교에서 크게 성능을 최적화. 사이클의 번호가 변경되지 않았지만 중첩 루프는 원칙적으로 "큰에서 마이너"를 따라야하지만 많은 시간이 오래 걸립니다. 당신은 전체 크기가 변경되지 않았습니다하지만, 작은 파일 여러 큰 파일을 복사하는 사이에 차이가 많이 복사,하지만 빠르게 여러 개의 작은 파일보다 훨씬 큰 파일을 복사 한 것입니다.
- 루프 변수 인스턴스
- 루프의 루프 변수의 예 :
/**
* 循环变量放在循环内
*/
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 회, 전. 요약 : 루프 변수가 인스턴스화 루프 외부에 배치되어야한다.
- 추출 및주기 독립적 인 표현
- 독립적 인 표현 추출물 없습니다
/**
* 未提取无关的表达式
*/
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 코드는 이중 카운트를 방지한다. 분석 이론적 관점에서, 최적의 성능은 높은되도록, 연산량을 줄일 수 있기 때문이다.
- 루프 판정 통화를 종료 할 때 방법을 제거
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 () 의심의 여지가 루프 밖으로 넣어해야하므로, 프로그램의 성능에 영향을 미치는 크기를 캐시 변수를 사용하는, 한 번 실행됩니다,하지 않는 우리가 너무 많이 소비하는 코드의이 조금 성능을 제공합니다.
- 예외 트랩
- 캐치 예외 내 :
/**
* 在内部捕获异常
*/
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를
분석 요약 :
캐치 예외는 매우 리소스를 많이 사용하기 때문에 내부 루프에 캐치를 시도하지 않는, 최적화 된 성능은 크기 향상의 몇 가지 주문을 가지고있다. 또한, "효과적인 자바"책에 대한-각각의 단순성과 예방의 버그 측면에서 루프 타의 추종을 불허하는 장점에 대한 전통을 가지고 있으며, 성능의 손실이없는 루프의 전통에 우선 루프, 따라서 권장 지적 - 각주기.
요약 :
이 일반적으로 그들이 당신에게 도움이 느끼는 경우에, 거기에 작은 붉은 마음을 방해하지 않는 곳을 알고 있어야 순환의 필요성에 사용됩니다.