Opt*_*Opt 10 c++ int performance size-t c++11
我将这里的代码翻译成C++,如下所示
#include <iostream>
using namespace std;
int t = 20;
bool is_evenly_divisible(const int a, const int b) {
for (int i=2; i<=b; ++i) { // Line 1
if (a%i != 0)
return false;
}
return true;
}
void run() {
int i = 10;
while (!is_evenly_divisible(i, t)) {
i += 2;
}
cout << i << endl;
}
int main(int argc, char** argv) {
run();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Mac OSX 10.8.4上使用编译器g ++ 4.8.1上的-O3标志,我得到0.568s用户时间.
现在,如果我将第1行中的计数器i在函数is_evenly_divisible中更改为size_t,则时间突然跳至1.588s.即使我将所有变量更改为size_t,这仍然存在,时间增加到1.646s
发生了什么?size_t不应该提高性能而不是降低性能,因为它比int更具体吗?
Cor*_*son 17
int
通常是最快的全能型.此属性不是标准规定的,但通常情况下今天的平台.我们还有像cstdint这样的东西int_fast32_t
,它更适合保证是最快的类型,可以容纳至少32位 - 强烈推荐它们用于性能敏感的代码!
size_t
不打算给出一个快速整数.其目的是提供一个整数,该整数可以保存平台地址空间可以包含的最大对象的大小.通常size_t
等同于CPU支持的最大"本机"整数,但不一定如此.
我猜你是在64位平台上.通常,64位平台对于32位和64位操作具有大约相等的性能,但是您已经达到了通常不是这样的位置:在64位整数上,div/mod实际上可能慢2-3倍.在这种情况下,如果int
是32位且size_t
是64位,它很好地解释了这个问题.
有关详细信息,请参阅Agner Fog的说明表文档.对于英特尔的Sandy Bridge平台,它显示32位div的延迟为20-28个周期,而64位div则需要30-94个周期.
归档时间: |
|
查看次数: |
2855 次 |
最近记录: |