>백엔드 개발 >C++ >반복에서 std::벡터가 std::array보다 빠른 이유는 무엇입니까?

반복에서 std::벡터가 std::array보다 빠른 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 02:51:30221검색

Why is std::vector Faster than std::array in Iteration?

std::array와 std::Vector를 통한 반복 간의 성능 차이

반복 성능을 평가하려고 했던 이전 벤치마크 std::array 및 std::Vector에는 몇 가지 결함이 포함되어 있습니다. 그러나 문제를 다시 검토하면서 std::Vector가 실제로 std::array보다 빠르다는 사실을 발견했습니다.

최적화 가능성을 완화하기 위해 다음을 포함한 여러 가지 조치를 취했습니다.

  • 루프 결과를 활용하여 컴파일러 최적화 방지
  • 속도 향상을 위해 -O3 플래그를 사용하여 컴파일
  • std::chrono를 사용하여 대상 for 루프만 측정

두 데이터 구조의 결과 실행 시간은 다음과 같습니다.

std::array:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 99.554109

std::Vector:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 30.734491

불일치 이유:

성능 불일치는 프로세스 주소에 상주하지 않는 std::array의 메모리 페이지에서 발생합니다. 공간. 특히 전역 범위 std::array는 실행 파일의 .bss 섹션에 위치하며 페이지 인되지 않았으며 0으로 초기화됩니다. 반면, std::Vector는 할당되고 0으로 초기화되어 해당 메모리 페이지가 이미 주소 공간에 존재하게 됩니다.

문제 해결:

이 문제를 제거하고 두 데이터 구조 간의 패리티를 입증하려면 다음 코드를 기본 첫 번째 줄에 추가하여 페이지를 가져올 수 있습니다.

<code class="cpp">std::fill_n(v.data(), n, 1); // included in <algorithm></code>

또는 Linux 시스템에서 mlock(v.data(), v.size() * sizeof(v[0]))을 사용할 수 있습니다. 페이지를 주소 공간으로 강제 이동합니다. 자세한 내용은 man mlock 매뉴얼 페이지를 참조하세요.

위 내용은 반복에서 std::벡터가 std::array보다 빠른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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