size_t在C++中的性能
Performance of size_t in C++
我将这里的代码翻译成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;
}
使用Mac OSX 10.8.4上编译器g++4.8.1上的-O3标志,我获得0.568s的用户时间。
现在,如果我将函数is_evenly_disible中第1行的计数器I更改为size_t,时间会突然跳到1.588s。即使我将所有变量更改为size_t,时间也会增加到1.646s
发生了什么事?size_t不是应该提高性能而不是降低性能吗?因为它是一个比int更具体的类型?
int
通常是最快的全能类型。这个属性不是标准强制要求的,但对于今天的平台来说通常是这样。我们还有一些东西,比如cstil力的int_fast32_t
,它被更恰当地保证是最快的类型,可以容纳至少32位——强烈推荐它们用于性能敏感的代码!
size_t
不打算给出一个快速整数。它的目的是提供一个整数,该整数可以容纳平台地址空间所能包含的最大大小对象的大小。通常,size_t
相当于CPU支持的最大"本机"整数,但它不一定是.
我猜你是在64位平台上。通常,对于32位和64位操作,64位平台的性能大致相等,但有一点是它们通常不一样的:div/mod在64位整数上实际上可能慢2-3倍。在这种情况下,如果int
是32位,而size_t
是64位,则可以很好地解释这个问题。
有关更多信息,请参阅Agner Fog的说明表文档。对于英特尔的SandyBridge平台,它显示32位div的延迟为20-28个周期,而64位div需要30-94个周期。
Size_t的大小是由实现定义的,如果您运行的是64位机器,大多数编译器都会将其设置为8字节长。
使用8字节整数的操作通常比使用4字节模拟的操作慢。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 不同的类或结构初始化方法之间的性能差异是什么?