>source

첫 번째 배열에서 인덱스로 값을 얻는 것이 두 번째 배열에서 더 많은 시간이 필요하다는 것에 놀랐습니다. 배열 길이에 의존하지 않으며, 내 테스트에서는 모든 조합에 해당됩니다. 나는 그것이 저수준 최적화에 달려 있다고 생각합니다. 누군가 설명 할 수 있습니까? 코드 예제는 다음과 같습니다.

           var a1 = new int[10];
            var a2 = new int[1000000];
            #region init
            var random = new Random(12345);
            for (int i = 0; i < a1.Length; i++)
                a1[i] = random.Next(1000000000);
            for (int i = 0; i < a2.Length; i++)
                a2[i] = random.Next(1000000000);
            #endregion
            Console.WriteLine("a1 Length = " + a1.Length);
            var watcher = Stopwatch.StartNew();
            var t1 = a1[a1.Length / 2];
            watcher.Stop();
            Console.WriteLine("a1 timestamp = " + watcher.ElapsedTicks); // average value 130-150 ticks

            Console.WriteLine("a2 Length = " + a2.Length);
            watcher = Stopwatch.StartNew();
            var t2 = a2[a2.Length / 2];
            watcher.Stop();
            Console.WriteLine("a2 timestamp = " + watcher.ElapsedTicks); //average value 10 - 15 ticks

            Console.ReadLine();

내 결과는 : -길이가 10 인 배열에서 인덱스로 값을 얻는 것은 ~ 130-150 틱입니다. -길이가 1000000 인 배열에서 색인으로 값을 얻는 것은 ~ 10-15 틱입니다


  • 답변 # 1

    성능 측정 방법을 변경하도록 제안하지만 측정이 정확하다고 가정하겠습니다. 여기에는 몇 가지 이유가있을 수 있으며 그 중 하나는 분기 예측입니다. 요컨대, 현대 프로세서는 계산에 분기 예측을 사용하고 있습니다.

    위키 백과에 따르면 :

    와이즈 비즈

    따라서 디지털 회로는 패턴을 식별하고 따르려고합니다. 매번 올바르게 추측하면 실행이 중지되지 않고 빠르게 진행되며 너무 자주 잘못 추측하면 롤백하고 다시 시작하는 데 많은 시간이 걸립니다. 같은 이유로 정렬 된 배열을 처리하는 것은 정렬되지 않은 배열을 처리하는 것보다 빠릅니다.

    The purpose of the branch predictor is to improve the flow in the instruction pipeline. Branch predictors play a critical role in achieving high effective performance in many modern pipelined microprocessor architectures such as x86.

관련 자료

  • 이전 php - laravel 웅변 자원 수집에서 속성 관계 숨기기
  • 다음 amazon cloudformation - API Gateway 용 SAM 템플릿에 Visual Studio 내에서 서버리스 응용 프로그램 솔루션의 일부로 오류가 있음