【发布时间】:2016-06-13 10:02:27
【问题描述】:
我正在学习C,考虑下面的代码sn-p:
#include <stdio.h>
int main(void) {
int fahr;
float calc;
for (fahr = 300; fahr >= 0; fahr = fahr - 20) {
calc = (5.0 / 9.0) * (fahr - 32);
printf("%3d %6.1f\n", fahr, calc);
}
return 0;
}
这是从 300 到 0 打印摄氏到华氏转换表。我编译它:
$ clang -std=c11 -Wall -g -O3 -march=native main.c -o main
我也用这个命令生成汇编代码:
$ clang -std=c11 -Wall -S -masm=intel -O3 -march=native main.c -o main
生成 1.26kb 文件和 71 行。
我稍微编辑了代码并将逻辑移到另一个在 main() 处初始化的函数中:
#include <stdio.h>
void foo(void) {
int fahr;
float calc;
for (fahr = 300; fahr >= 0; fahr = fahr - 20) {
calc = (5.0 / 9.0) * (fahr - 32);
printf("%3d %6.1f\n", fahr, calc);
}
}
int main(void) {
foo();
return 0;
}
这将生成 2.33kb 的 128 行汇编代码。
用time ./main 运行这两个程序我发现执行速度没有差异。
我的问题是,通过汇编代码的长度来优化你的 C 程序有什么关系吗?
【问题讨论】:
-
您看不到任何区别,因为这两个程序之间的唯一区别是一个调用
foo。查看生成的汇编代码,不要只查看不相关的可执行文件的大小。 BTW 大部分 CPU 时间都被printf占用了,粗略估计:95% -
如果你正在学习 C,只关注语言本身,不要担心优化。当您更精通该语言时,您可以稍后进行优化,
-
@GiacomoDegliEsposti:如果您已经知道计算机是如何工作的,那么看看 C 如何编译成 asm 将使您对 C 有更深入的了解,因为它与 asm 非常接近,可以理解简单函数是如何发生的。不过,大多数时候,您应该强迫自己不要过多考虑 asm,而只需编写人类可读且可靠运行的代码。
-
指令少不一定表示速度。许多容易创建的情况是更多的指令比更少的指令更快......“这取决于”。测试速度的唯一方法是测量速度。凭借经验,您可能能够弄清楚哪些事情比其他事情花费的时间更长,并能够调整您的高级代码以提高速度。但是您首先必须从准确计时代码开始,然后进行调整并了解这些调整为什么会帮助或伤害。对于具有如此多变体和变量的 x86 系统,几乎不值得花时间进行调整,因为调整一个会使另一个变慢。