簡體   English   中英

uint32_t 作為向量索引在 64 位中比 size_t 具有更好的性能

[英]uint32_t as vector index has better performance than size_t in 64-bit

我有一些與此類似的性能關鍵代碼:

void func(std::vector<int>& v, size_t i)
{
  while(i > 0)
  {
    // do something with v[i]
    // compute next i   
  }
}

在我將i的類型從size_t更改為uint32_t后,代碼的運行時間減少了 10% 以上。 調用此 function 時,其輸入類型始終為size_t 該代碼是使用 Clang 以 64 位編譯的。 function 被編譯器內聯在更復雜上下文的多個位置,因此很難比較匯編代碼。 有什么一般的想法為什么會發生這種情況?


我做了一些進一步的調查。 首先,當使用uint32_t作為向量索引時,Clang 似乎不能很好地優化代碼。 請參見以下示例:

void func(std::vector<int>& v, size_t i)
{
  for(auto j = i; j < v.size(); ++j)
  {
    v[j] = 0;    
  }
}

如果我們將size_t更改為uint32_t ,將生成大量的程序集: https://godbolt.org/z/1qrrrs

至於我的性能關鍵代碼,當使用size_t時,Clang 可以進行更積極的循環展開。 然而,事實證明這種展開的性能更差,可能是由於某些分支沒有像預期的那樣經常被擊中。 我手動做了一些展開,現在size_tuint32_t之間的性能是一樣的。

有什么一般的想法為什么會發生這種情況?

  • CPU 上的 32 位操作可能更快
  • 變量大小的變化可能導致堆棧相對於 memory 頁面邊界的對齊方式不同,和/或由於緩存沖突導致某些特別關鍵的數據或指令不會丟失,從而導致偶然更改在性能上。

暫無
暫無

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

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