![](/img/trans.png)
[英]Is comparison of uint8_t values in 64-bit Intel architecture slower than comparison of uint32_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_t
和uint32_t
之間的性能是一樣的。
有什么一般的想法為什么會發生這種情況?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.