>백엔드 개발 >C++ >`std::array`보다 `std::벡터`를 반복하는 것이 더 빠른 이유는 무엇입니까?

`std::array`보다 `std::벡터`를 반복하는 것이 더 빠른 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-01 17:18:31876검색

Why is iterating through `std::vector` faster than `std::array`?

운명의 역전: std::Vector를 통한 반복이 std::array를 능가함

초기 가정과 달리 최근 벤치마크 결과 std::Vector를 통해 반복하는 것이 std::array를 통해 반복하는 것보다 훨씬 빠릅니다. 이는 어레이가 우수한 반복 성능을 제공한다는 이전의 믿음과 상반됩니다.

정확성을 보장하기 위해 벤치마크에서는 몇 가지 개선 사항을 적용했습니다.

  • 결과 소비 시행: 컴파일러 최적화에서 루프가 제거되는 것을 방지하기 위해 trivial 루프를 사용했습니다.
  • -O3 최적화 사용: 성능을 극대화하기 위해 가장 높은 최적화 수준으로 코드를 컴파일했습니다.
  • 루프 측정 격리: std::chrono는 변수 초기화를 제외하고 반복 시간만 측정하는 데 사용되었습니다.

std::array 및 std::Vector에 대해 측정된 시간은 다음과 같습니다. 다음은 다음과 같습니다.

std::array: 99.554109 milliseconds
std::vector: 30.734491 milliseconds

원인 탐색

std::Vector의 놀라운 속도 이점은 메모리 페이징에 기인할 수 있습니다. 전역 범위에 저장되는 배열은 처음에는 실행 파일의 .bss 섹션에 상주하며 프로세스 주소 공간으로 페이징되지 않습니다. 이와 대조적으로 std::Vector는 생성 중에 할당되고 0으로 채워지므로 메모리 페이지가 메모리에 존재하게 됩니다.

문제 해결

경쟁의 장을 평준화하려면 반복 전에 배열을 명시적으로 초기화하거나 해당 페이지를 메모리로 가져올 수 있습니다. 다음은 배열 반복 시간을 std::Vector:

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

또는 mlock() 함수를 사용하여 Linux 시스템의 메모리에 배열 페이지를 강제로 저장할 수 있도록 수정한 것입니다.

이 조정은 std::array와 std::Vector 간의 성능 차이가 주로 메모리 관리 전략에서 비롯된다는 점을 보여주며, 프로그램 성능에서 메모리 액세스 패턴의 중요성을 강조합니다.

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

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