1

就我而言,我想要更好的速度。
他们之间哪一个在速度上更好。

例如:

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 );
4

3 回答 3

1

除了测量时钟周期外,您还可以使用反汇编来准确确定编译器选择了什么

基本上在这么小的代码中,编译器很可能会为更快和更小的代码做出正确的选择(特别是如果针对速度进行了优化),在这种情况下,为了代码可移植性和避免错误,更喜欢使用 C 而不是 asm做些小改动

如果编译器没有选择与您的程序集相同的方法,我会尝试找出原因。这可能非常重要。

于 2013-08-12T07:21:44.793 回答
0

您可以使用 cpu 周期来衡量两种方法的性能差异。试试这个,而不是时钟:

inline uint64 getCycles() {
    uint64 cycles;

    __asm__ __volatile__("rdtsc" : "=A" (cycles));

    return cycles;
}
于 2013-08-12T06:40:45.343 回答
0

我认为两个版本之间不会有太大区别。唯一的区别可能是您可以编写最适合您的 CPU 的 asm 代码,但编译器可能会编写通用代码。

如果您有内存操作、if 语句、for 循环,则可能会有所不同。

循环、缓存问题和系统调用是最大的时间消耗者。

我会说,为这样一个简单的案例编写 C 代码以提高可读性是更明智的做法。

您可以编写干净的 C 代码并通过其他方式获得最佳性能:使用特殊硬件(例如:GPU)、更好的算法、重新定义问题、更好的编译器使用......

于 2013-08-20T17:21:31.180 回答