C语言中的微观优化,有哪些?有真正有用的人吗?

C语言中的微观优化,有哪些?有真正有用的人吗?,c,micro-optimization,C,Micro Optimization,我了解大多数微优化,但它们真的有用吗 x ^= y y ^= x x ^= y 示例:对(;)执行++i而不是i++或时,对(;)执行是否真的会提高性能(内存指纹或CPU周期) 所以问题是,在C语言中可以进行哪些微观优化?它们真的有用吗?我认为您不需要考虑这些微优化,因为它们大多数是由编译器完成的。这些东西只会使代码更难阅读 x ^= y y ^= x x ^= y 记住,[edited]过早的[/edited]优化是一种邪恶。你应该依靠你的编译器来优化这些东西。专注于使用适当的算法,编写可

我了解大多数微优化,但它们真的有用吗

x ^= y
y ^= x
x ^= y
示例:对(;)执行
++i
而不是
i++
时,对(;)
执行
是否真的会提高性能(内存指纹或CPU周期)


所以问题是,在C语言中可以进行哪些微观优化?它们真的有用吗?

我认为您不需要考虑这些微优化,因为它们大多数是由编译器完成的。这些东西只会使代码更难阅读

x ^= y
y ^= x
x ^= y

记住,[edited]过早的[/edited]优化是一种邪恶。

你应该依靠你的编译器来优化这些东西。专注于使用适当的算法,编写可靠、可读和可维护的代码。

老实说,这个问题虽然有效,但在今天却不相关——为什么

编译器编写者比20年前聪明得多,及时倒回,那么这些优化就非常重要了,我们都在使用旧的80286/386处理器,而代码编写者通常会采取一些技巧,从编译后的代码中挤出更多的字节

今天,处理器速度太快了,编译器编写人员知道操作数指令的详细信息,可以让每件事情都正常工作,考虑到有管道内衬、核心处理器、数英亩的RAM,请记住,使用80386处理器,将有4Mb的RAM,如果幸运的话,8Mb被认为是优越的

范式已经改变,它是关于压缩编译代码中的每一个字节,现在它更多的是关于程序员的生产力和更快的发布

以上我已经说明了处理器和编译器的性质,我所说的是Intel 80x86处理器系列Borland/Microsoft编译器

希望这有帮助, 顺致敬意,
Tom.

我认为,微观优化、技巧和替代方法之间是有区别的。使用
++i
而不是
i++
可能是一种微观优化,尽管我认为这仅仅是为了避免悲观,因为在预递增(或递减)时,编译器不需要插入代码来跟踪表达式中使用的变量的当前值。如果使用预递增/递减不会改变表达式的语义,那么应该使用它并避免开销

另一方面,一个技巧是使用不明显的机制比直接机制更快地实现结果的代码。除非绝对需要,否则应避免使用诡计。提高一小部分速度通常不值得对代码可读性造成损害,除非这一小部分速度反映了一段有意义的时间。非常长时间运行的程序,尤其是计算量大的程序,或实时程序,通常是可能出现问题的候选程序,因为节省的时间量可能是满足系统性能目标所必需的。如果使用这些技巧,应清楚地记录下来


可供选择的,就是这样。可能没有或几乎没有绩效增益;它们只是表达相同意图的两种不同方式。编译器甚至可能产生相同的代码。在本例中,选择可读性最高的表达式。即使它会导致一些性能损失,我也会这样做(尽管参见上一段)。

++在不使用返回值的情况下,我应该比I++更受欢迎,因为它更好地表示您正在尝试执行的操作的语义(增量I),而不是任何可能的优化(可能稍快一点,可能不会更糟)。对于+++ i与i++(至少在C++上下文中),稍微有点务实的态度,请参阅< /P> < P>。
如果Chris Lattner这么说的话,我必须注意;-

有一天,tclhttpd,一个用最慢的脚本语言之一Tcl编写的Web服务器,成功地超越了Apache,一个用据说最快的编译语言之一C编写的Web服务器,就在那天,我确信与使用更快的算法/技术相比,微优化明显相形见绌*


在调试器中证明问题所在之前,不要担心微优化。即便如此,我还是建议你先来这里问问,希望有人能说服你不要这样做是不是一个好主意

这是违反直觉的,但通常代码,特别是紧密嵌套循环或递归,通过添加代码而不是删除代码来优化。游戏行业已经想出了无数的技巧来加速嵌套循环,使用过滤器来避免不必要的处理。这些过滤器添加的指令比i++和++i之间的差异要多得多


*注:从那时起,我们学到了很多。一个缓慢的脚本语言可以比编译的机器代码更出色,因为生成线程是昂贵的,这导致了LoTTDPD、NGNIX和ApACE2的发展。

< P>你最好把你编写的每一个程序都看作是一种语言,在其中你传达你的想法,其他人的意图和推理,他们将不得不修复、重用和理解bug。他们将花费比任何编译器或运行时系统执行它更多的时间来解码乱码。 总结一下,用所讨论语言的常用习惯用语,以最清晰的方式说出你的意思


对于C中的这些特定示例,For(;;)是无限循环的惯用法,“i++”是“addone to i”的常用惯用法,除非在表达式中使用值,在这种情况下,这取决于意义最清晰的值是增量之前还是之后的值。

记住内存是新磁盘这一事实,可能会比应用任何这些微优化更能提高性能。

通常,向零计数的循环比向零计数的循环快
int i;
for (i = x-1; i != 0; i--)
{
    doStuff(array[i]);
}
doStuff(array[0]);
int i = x;
while (i != 0)
{
    --i;
    printf("%d\n",doStuff(array[i]));
}