>  기사  >  백엔드 개발  >  내 벤치마크에서 std::array보다 std::Vector를 통해 반복하는 것이 더 빠른 이유는 무엇입니까?

내 벤치마크에서 std::array보다 std::Vector를 통해 반복하는 것이 더 빠른 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 03:19:02245검색

Why is iterating through std::vector faster than std::array in my benchmark?

std::Vector를 통한 반복이 std::array를 통한 반복보다 빠른 이유

이전 벤치마크에서는 반복이 다음과 같이 가정되었습니다. std::array를 통해 std::Vector를 통해 반복하는 것보다 빠릅니다. 그러나 후속 벤치마크 개정에서는 std::Vector가 실제로 더 빠른 옵션이라는 사실이 밝혀졌습니다. 이 기사에서는 예상치 못한 발견의 원인을 조사합니다.

벤치마크 개선

향상된 벤치마크는 원래 구현에서 다음과 같은 결함을 해결했습니다.

  • 루프 결과를 보장하여 최적화 누락을 방지합니다.
  • 속도 향상을 위해 -O3 플래그를 활용합니다.
  • std::chrono를 사용하여 측정을 for 루프에만 격리합니다.

벤치마크 결과

결과 벤치마크 타이밍은 이전 가정과 반대로 다음을 입증했습니다.

  • std::array: 실행 시간 = 99.554109밀리초
  • std::Vector: 실행 시간 = 30.734491밀리초

분석

관찰된 성능 차이는 다음에서 비롯됩니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.