簡體   English   中英

為什么切換 for 循環的順序會顯着改變執行時間?

[英]Why does switching the order of for loops significantly change the execution time?

在下面的代碼中,我有 2 個嵌套的 for 循環。 第二個交換 for 循環的順序,運行速度明顯更快。

這純粹是一個緩存局部性問題(第一個代碼在向量上循環多次,而第二個代碼在向量上循環一次),還是有其他我不理解的東西?

int main() 
{ 
  using namespace std::chrono;
  auto n = 1 << 12;
  vector<int> v(n);

  high_resolution_clock::time_point t1 = high_resolution_clock::now();
  for(int i = 0; i < (1 << 16); ++i)
  {
    for(const auto val : v) i & val;
  }
  high_resolution_clock::time_point t2 = high_resolution_clock::now();
  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
  std::cout << "It took me " << time_span.count() << " seconds.";
  std::cout << std::endl;

  t1 = high_resolution_clock::now();
  for(const auto val : v)
  {
     for(int i = 0; i < (1 << 16); ++i) i & val;
  }
  t2 = high_resolution_clock::now();
  time_span = duration_cast<duration<double>>(t2 - t1);
  std::cout << "It took me " << time_span.count() << " seconds.";
  std::cout << std::endl;
}

正如所寫,第二個循環只需要從向量 v 中讀取每個 val 一次。 第一個版本需要在內部循環中為每個 i 從向量 v 中讀取每個 val 一次,因此總共需要 65536 次。

所以在沒有任何優化的情況下,這將使第二個循環快幾倍。 在優化程度足夠高的情況下,編譯器會發現所有這些計算都沒有任何意義,而且是不必要的,並將它們全部丟棄。 然后,您的執行時間將從 go 降為零。

如果您更改代碼以對結果做一些事情(比如將所有值 i 和 val 相加,然后打印總數),一個非常好的編譯器可能會發現兩段代碼產生相同的結果並為兩者使用更快的方法個案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM