示例代码:
template<typename T>
inline void Solution() {
T n = 0;
T k = 0;
T s = 1;
while (k < 500) {
n += s++;
k = 2;
T lim = n;
for (T i = 2; i < lim; i++) {
if (n % i == 0) {
lim = n / i;
k += 2;
}
}
}
std::cout << "index: " << s << std::endl;
std::cout << "value: " << n << std::endl;
}
使用int32_t和int64_t(超过2倍)的计算时间之间存在差异。所以,简单的问题是:“为什么?”
Solution<int32_t> -> 0.35s on x32 build
Solution<int64_t> -> 0.75s on x32 build
答案 0 :(得分:2)
如果x32
构建意味着您的平台是32位,那么结果是预期的,因为机器字的大小是32位。您平台上的sizeof(void*)
是什么?
如果它是64位那么它可能意味着你的while循环不适合你的cpu的指令缓存行。
实际上,像(gprof,cachegrind,stackgrind等)这样的分析工具将提供比猜测更正确的答案。
答案 1 :(得分:1)
打印汇编语言,特别是分部。
在32位平台上,可能需要以双字样式执行64位算术运算。例如,通过添加,首先添加较低的32位值,然后将较高的32位与第一次添加的进位一起添加。汇编语言将显示这一点。
此外,除非您的平台有分部指示,否则该部门将由软件执行。 64位除法将比32位具有更多的操作,因此需要更长的时间。
正如其他人所说,检查机器的指令和数据对齐方式。汇编语言应该显示这一点。