>  기사  >  백엔드 개발  >  이 벤치마크에서 `std::벡터`를 통한 반복이 `std::array`보다 빠른 이유는 무엇입니까?

이 벤치마크에서 `std::벡터`를 통한 반복이 `std::array`보다 빠른 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-01 14:50:02739검색

Why is Iterating through `std::vector` Faster than `std::array` in This Benchmark?

반복 성능의 복잡성: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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