문제

JavaScript에서 다음과 같은 루프를 만듭니다. for(int i = 0; i < arr.length; i++) 매번 배열 길이를 계산하므로 비용이 많이 듭니다. 이 동작은 목록 및 배열에 대해서도 C#에서 비용이 많이 듭니다. 아니면 컴파일 타임에 최적화 되었습니까? 또한 Java와 같은 다른 언어는 어떻습니까?

도움이 되었습니까?

해결책

그것은이다 ~ 아니다 C#에서 비용이 많이 듭니다. 우선, "계산"이 없습니다. : 길이를 쿼리하는 것은 기본적으로 인라인 덕분에 기본 작업입니다. 둘째, (개발자에 따르면), 컴파일러는 이러한 액세스 패턴을 인식하고 실제로 배열 요소의 액세스에 대해 (중복) 경계 검사를 최적화합니다.

그건 그렇고, 나는 현대의 JavaScript 가상 머신과 비슷한 것이 사실이라고 생각하며, 아직 그렇지 않은 경우, 이것이 사소한 최적화이기 때문에 곧있을 것입니다.

다른 팁

  1. 모든 .NET 어레이에는 배열의 길이가 포함 된 필드가 있으므로 길이는 사용량이 아니라 생성 시간에 계산됩니다.

  2. .NET 가상 머신은 가능할 때마다 경계 검사를 제거하는 데 매우 능숙합니다.이 경우 중 하나입니다.이 경우 경계 검사가 루프 밖으로 이동하는 경우 (대부분의 상황에서는 두 가지 지침이 아닌 경우).

편집하다:

배열 바운드 검사 제거

거의 모든 언어에서 대답은 "의존적"이 될 것입니다.

대부분은 컴파일러가 루프에있는 동안 목록의 길이 또는 배열이 변경 될 수 있는지 여부를 알 수있을 정도로 영리한 지에 따라 다릅니다.

그러나 그것은 언어 사양에 의해 정의되지 않을 것입니다.

따라서 컴파일이이를 알아낼 수 없다고 가정하는 것이 안전 할 것입니다. 객체의 길이가 변하지 않는다고 진정으로 믿는다면 먼저 길이를 계산하고 루프 제어 구조에서이를 사용하십시오.

그러나 다른 스레드를 조심하십시오 ...

Java와 비슷한 경우 O (1) 작업이어야합니다.

다음 링크가 도움이되었습니다. http://www.devguru.com/technologies/ecmascript/quickref/array.html

또한 Getter가 계산을 수행하는지 또는 알려진 값에 액세스하는지 여부에 따라 다릅니다.

LINQ COUNT () 확장 방법을 사용하면 호출 할 때마다 계산할 수 있다고 생각합니다.

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