반복 성능의 복잡성: std::array 대 std::Vector
이전 문의에서 반복 성능이 std::array를 통한 반복은 std::Vector를 통한 반복보다 눈에 띄게 빨랐습니다. 이러한 잘못된 관찰을 수정하기 위해 새로운 벤치마크가 고안되어 놀라운 반전이 나타났습니다. 이제 std::Vector를 통한 반복이 훨씬 빨라졌습니다.
잠재적인 최적화를 피하기 위해 루프 결과가 포함되었으며, O3 플래그가 활성화되었습니다. 또한 루프 실행을 분리하여 정확한 타이밍을 위해 std::chrono가 사용되었습니다.
결과는 놀랍습니다.
std::array:
$ ./a.out result: 0 time: 99.554109
std::Vector:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 30.734491
미스터리 풀기
Godbolt에서 분해를 살펴보면 다음과 같습니다. 성능 불일치는 프로세스 주소 공간 내의 메모리 페이지 상주로 인해 발생한다는 것이 분명합니다. std::벡터가 이미 할당되고 0으로 채워진 반면, std::array는 실행 파일의 전역 .bss 섹션에 저장되었으며 해당 페이지는 페이지에 포함되지 않았습니다.
해결 중 문제
이 불일치를 해결하려면 std::array 페이지를 주소 공간으로 가져와야 합니다. 이는 주 함수의 시작 부분에 다음 줄을 추가하여 수행할 수 있습니다:
std::fill_n(v.data(), n, 1); // included in <algorithm>
또는 Linux에서는 mlock()을 사용하여:
mlock(v.data(), v.size() * sizeof(v[0]));
결론
이 벤치마크는 반복 성능에 있어 페이지 상주가 얼마나 중요한지 강조합니다. std::array 및 std::Vector의 페이지가 주소 공간에 모두 존재하도록 하면 반복 성능이 크게 향상될 수 있습니다.
위 내용은 이 벤치마크에서 `std::벡터`를 통한 반복이 `std::array`보다 빠른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!