문제

다음 중 성능이 가장 좋은 것은 무엇입니까?

JavaScript로 구현된 방법 2를 보았지만 C#에서는 어떤 이득도 측정할 수 없었고 방법 1처럼 작성되었을 때에도 컴파일러가 이미 방법 2를 수행하는지 궁금했습니다.

방법 2의 기본 이론은 코드가 반복할 때마다 DataTable.Rows.Count에 액세스할 필요가 없으며 간단하게 int c에 액세스할 수 있다는 것입니다.

방법 1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

방법 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}
도움이 되었습니까?

해결책

아뇨 표현할 방법이 없어서 그럴 수가 없어요 시간이 지나도 변함없는 가치를 위해.

컴파일러가 이를 수행할 수 있어야 한다면 값을 반환하는 코드에서 값이 일정하고 루프 기간 동안 변경되지 않는다는 보장이 있어야 합니다.

그러나 이 경우 루프의 일부로 데이터 테이블에 새 행을 자유롭게 추가할 수 있으므로 보장하는 것은 사용자에게 달려 있습니다.

즉, 끝 인덱스가 변수가 아닌 경우 컴파일러는 해당 최적화를 수행하지 않습니다.

컴파일러가 루프 코드만 보고 이 특정 변수가 변경되지 않았음을 확인할 수 있는 변수의 경우 루프를 시작하기 전에 그렇게 하고 값을 레지스터에 로드할 수 있지만 이로 인해 성능이 향상됩니다. 루프 본문이 비어 있지 않으면 무시할 가능성이 높습니다.

결론:끝 루프 인덱스가 루프 기간 동안 일정하다는 것을 알고 있거나 받아들이려는 경우 이를 변수에 배치합니다.


편집하다: 게시물을 다시 읽어보세요. 예, JITter가 코드를 최적화하기 때문에 두 가지 경우에서도 성능 향상이 미미할 수 있습니다.JITter는 행 개수가 포함된 데이터 테이블 내부의 변수에 직접 액세스하도록 최종 인덱스 읽기를 최적화할 수 있으며, 어쨌든 메모리 읽기는 그다지 비싸지 않습니다.반면에 해당 속성을 읽는 작업이 매우 비용이 많이 드는 작업인 경우에는 더 눈에 띄는 차이점을 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top