我的老板告诉我,他从一本书中学到了快速的VB6算法,并且写东西的最短方式不一定是最快的(例如,内置方法有时比自写方法慢,因为它们进行各种检查或在您的情况下可能不需要的unicode转换。)
现在我想知道,是否有一个关于快速不同结构的信息的网站有各种语言,特别是。 Java / C#/ Python / ...(也是C ++,但有很多编译器可能有很多不同)。
E.g。
之间有区别吗?if (a()) b();
和
a() && b();
另一个例子:a = a * 4
是否可以编译为与a <<= 2
相同的代码?
我可以自己测试一下,当然,写两个然后运行它们100000次并比较运行时,但我也想学习写东西的新方法,甚至可能是我以前没有考虑过的东西。谢谢你的回答!
答案 0 :(得分:11)
我想说这些可能是那种不会产生影响并且不值得努力的微优化。
如果你真的想看看你引用的那些黑客是否有所作为,我建议你先获得想要改变的代码的性能基线。以相同的方式进行更改并重新测量性能。如果你得到的结果表明它是值得的,那么一定要继续。
您最好分析代码并找出代码中最慢的部分所处的位置以及完成大部分工作的位置。猜测很少在优化时起作用。
答案 1 :(得分:9)
if (a()) b();
和a() && b();
之间有区别吗?
是的,可读性。第一个是关于意图的更清楚。
a = a * 4
是否可以编译为与a <<= 2
相同的代码?
很可能是的。但即使它们最终成为不同的CPU指令,时间上的差异也会非常小,并且依赖于之前和之后的指令。
现代CPU的微优化是
总之,首先编写可读代码。如果遇到性能问题,请先进行配置文件和测量。
您应该担心使用正确的算法,而不是阅读超出需要的集合等。但是在指令/语句级别,您和实际执行的内容之间有太多层(编译器,抖动,流水线CPU)。
答案 2 :(得分:8)
不要被这种微观优化所困扰。他们不会在性能方面给你任何东西。
如果您遇到性能问题,请找出瓶颈并对其进行优化。
答案 3 :(得分:4)
始终尽力创建良好,干净,高效的代码。这可能意味着微优化(比如使用stringbuilder而不是添加字符串,如果没有必要就不使用正则表达式,像这样的东西,不要听那些说这些毫无意义的人:如果你写错了代码而且不要'甚至小心,JITter也不会帮助你)或瓶颈优化(不要从整个表中选择*,使用多线程)。托管环境将完成剩下的工作。 CPU密集型产品永远不会像非托管代码一样高效,但也有许多优点,这就是大多数人喜欢使用它们的原因。如果您想要快速的代码片段,请在C,汇编或硬件中执行。今天的大多数业务应用程序都不是CPU密集型的,如GUI,Web服务,数据库,磁盘使用,它们都涉及大量等待和空闲的CPU。
关于你的问题:if(a())b();和()&amp;&amp; B();完全相同,这里没有优化。 a * a和a <&lt; <2不相同,后者是* 4。
答案 4 :(得分:0)
这是一个很老的问题,但也有一个方面,没有人提到:
运算符过载
a *= 4
、a = a * 4
、a = a << 2
和 a <<= 2
只会对没有运算符重载的普通整数执行相同的操作。
在所有提到的语言(Java 除外)中,您可以轻松添加运算符 oveload,并且每种形式都可以产生完全不同的结果。如果您使用整数,后来又决定使用浮点数,则某些运算符可能会出现问题,因为它们未定义(<<
、<<=
)等。
另一方面,在纯整数的情况下,许多形式可能会生成完全相同的机器代码。在某些平台上,机器代码根本不涉及乘法或左移 - 例如x64 上的 c++ 编译器倾向于为所有情况生成 lea eax, [4*rdi]
。所以编译器会比你聪明。