std::Vector를 통한 반복이 std::array를 통한 반복보다 빠른 이유
이전 벤치마크에서는 반복이 다음과 같이 가정되었습니다. std::array를 통해 std::Vector를 통해 반복하는 것보다 빠릅니다. 그러나 후속 벤치마크 개정에서는 std::Vector가 실제로 더 빠른 옵션이라는 사실이 밝혀졌습니다. 이 기사에서는 예상치 못한 발견의 원인을 조사합니다.
벤치마크 개선
향상된 벤치마크는 원래 구현에서 다음과 같은 결함을 해결했습니다.
벤치마크 결과
결과 벤치마크 타이밍은 이전 가정과 반대로 다음을 입증했습니다.
분석
관찰된 성능 차이는 다음에서 비롯됩니다. std::array와 std::Vector 간의 메모리 관리 차이점. std::array의 경우 전역 범위 배열은 처음에 비페이징 메모리에 있는 실행 파일의 .bss 섹션에 저장됩니다. 결과적으로 std::array에 처음 액세스하면 메모리 페이지에 오류가 발생하여 성능 오버헤드가 발생합니다.
반면에 std::Vector는 메모리 페이지를 할당하고 0으로 채웁니다. 창조. 이렇게 하면 루프가 벡터를 반복할 때 페이지가 이미 메모리에 존재하게 됩니다.
이 개념을 설명하기 위해 std의 메모리 페이지를 가져오는 코드 줄이 기본 함수의 시작 부분에 추가되었습니다. ::배열을 주소 공간에 추가:
<code class="cpp">std::fill_n(v.data(), n, 1);</code>
페이지를 사전 오류화함으로써 std::array의 실행 시간이 std::Vector의 실행 시간과 일치하도록 단축됩니다.
결론
std::array와 std::Vector를 통한 반복의 성능 차이는 메모리 관리 메커니즘에서 발생합니다. std::array 페이지에 오류가 발생하거나 mlock을 지원하는 운영 체제에서 프로그램을 실행하면 std::array의 성능이 std::Vector의 성능과 일치하도록 향상될 수 있습니다.
위 내용은 내 벤치마크에서 std::array보다 std::Vector를 통해 반복하는 것이 더 빠른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!