在我的情况下,我想要更好的速度 速度之间哪一个更好。
例如:
int n=0;
__asm {
MOV n, 100
INC n
ADD n, 100
}
printf("%d\n", n);
或
int n=0;
n = 100;
n++;
n += 100;
printf("%d\n", n);
我使用以下代码来了解它们之间有什么更好的结果,但它们不会给我一个结果来告诉我什么更好。
double duration;
clock_t start, end;
start = clock();
// code here
end = clock();
duration = (double)(end - start) / CLOCKS_PER_SEC;
printf("%f\n", duration );
答案 0 :(得分:1)
除了测量时钟周期外,您还可以使用反汇编来确定编译器选择的确切内容
基本上在如此小的代码中,编译器很可能为更快和更小的代码做出正确的选择(特别是如果针对速度进行了优化),并且在这种情况下,优选使用C而不是asm来实现代码的可移植性和避免你做一些小改动时的错误
如果编译器没有选择与你的程序集相同的方法,我会试图找出原因。这可能非常重要。
答案 1 :(得分:0)
您可以使用cpu周期来衡量两种方法的性能差异。试试这个,而不是时钟:
inline uint64 getCycles() {
uint64 cycles;
__asm__ __volatile__("rdtsc" : "=A" (cycles));
return cycles;
}
答案 2 :(得分:0)
我认为两个版本之间没有太大区别。唯一的区别可能是您可以编写最适合您的CPU的asm代码,但编译器可能会编写一般代码。
如果你有内存操作,if语句,for循环可能会有区别。
循环,缓存问题和系统调用是消费者最大的时间。
我想说为这样一个简单的可读性案例编写C代码是明智的。
您可以编写干净的C代码并通过其他方式获得最佳性能:使用特殊硬件(例如:GPU),更好的算法,重新定义问题,更好的编译器使用....