我想知道双变量的长度是否会对乘法时间产生影响。出于测试目的,我编写了以下一小段代码:
#include <iostream>
#include <time.h>
int main() {
double x = 123.456;
double a = 1.23456;
double b = 1.234;
double d = 1.0;
// experiment 1
clock_t start = clock();
for( unsigned long long int i = 0; i < 10000000; ++i ) {
x *= a;
}
clock_t end = clock();
std::cout << "123.456*1.23456 takes " << (double)(end-start)/CLOCKS_PER_SEC << " secs" << std::endl;
// experiment 2
start = clock();
for( unsigned long long int i = 0; i < 10000000; ++i ) {
x *= b;
}
end = clock();
std::cout << "123.456*1.234 takes " << (double)(end-start)/CLOCKS_PER_SEC << " secs" << std::endl;
// experiment 3
start = clock();
for( unsigned long long int i = 0; i < 10000000; ++i ) {
x *= d;
}
end = clock();
std::cout << "123.456*1.0 takes " << (double)(end-start)/CLOCKS_PER_SEC << " secs" << std::endl;
return 0;
}
我使用 VS2008编译它,64位处于发布模式,没有优化和调试信息。结果并不令人惊讶:所有三种乘法都持续完全相同的时间,差别只有几毫秒。我的问题是:为什么会这样?如果我犯了一个错误并将数字乘以1.0而不是1,并且我不使用任何编译器优化,那么我的乘法将持续比将数字乘以1更长的时间!当人类繁殖时,数字越短,我们得到的结果就越快。计算机如何成倍增加,无关紧要,两个数字有多长?
除此之外,我决定检查调试是否会影响运行时速度。在这种情况下,它不会:使用\DEBUG
选项进行编译或不进行编译,乘法总是花费相同的时间。
启用优化\O2
后,相同的乘法仅持续千分之一秒。在这种情况下优化会做什么?怎样才能优化在C ++中乘以两个双精度的紧凑代码?
我会很感激任何解释,在C ++中的双倍乘法期间会发生什么。
答案 0 :(得分:2)
变量的长度始终相同,但值不同。换句话说:在硬件级别执行的操作是完全相同的,因此产生。例如,一个整数,乘以0(零输出结果,即将0传送到目标寄存器)与乘以1(将操作数复制到目标寄存器)的时间相同。
答案 1 :(得分:2)
浮点数(单精度)为32位,双打为64位。
http://en.wikipedia.org/wiki/IEEE_754-2008
在Intel / AMD处理器上...... FPU(x87)或SIMDD(SSEx)将以恒定的周期数计算MULTIplication。速度取决于吞吐量,底层操作和延迟。
http://www.agner.org/optimize/instruction_tables.pdf
答案 2 :(得分:1)
启用优化\ O2后,相同的乘法仅持续千分之一秒。在这种情况下,优化会做什么?
由于你从不使用你的结果(x
),所以消除所有乘法是完全有效的。尝试显示结果。
另请注意,您正在进行10M乘法,使用现代处理器,您每秒至少有1G的时钟周期,在这种情况下,它会执行非常紧凑的循环。
答案 3 :(得分:1)
当人类繁殖时,数字越短,我们就越快 结果。计算机如何繁殖以使其无关紧要, 这两个数字有多长?
计算机的工作方式与人类相同,一次计算一位数,并将部分结果相加以得到答案。然而,可以装入单个芯片的硬件数量已经发展到可以为每个数字提供专用电路的程度,因此它可以同时并行计算每个数字。当然它都是二进制的,但原理是一样的。