Optimization 什么';编译器优化的极限是什么?它有多聪明?

Optimization 什么';编译器优化的极限是什么?它有多聪明?,optimization,compiler-construction,Optimization,Compiler Construction,人们一直告诉我,不要写“左移1位”,只要写“乘以2”就行了,因为它可读性强得多,而且编译会足够聪明,可以进行优化 编译器通常会做什么,而开发人员不应该做什么(为了代码可读性)?我总是写string.length==0而不是string==”,因为我在5-6年前的某个地方读到过,说数值运算要快得多。这仍然是真的吗 或者,大多数编译器是否足够聪明,可以转换以下内容: int结果=0; 对于(int i=0;i算法:到目前为止,地球上没有一个编译器能为您选择更好的算法。太多的人在基准测试后匆忙跳转到C

人们一直告诉我,不要写“左移1位”,只要写“乘以2”就行了,因为它可读性强得多,而且编译会足够聪明,可以进行优化


编译器通常会做什么,而开发人员不应该做什么(为了代码可读性)?我总是写
string.length==0
而不是
string==”
,因为我在5-6年前的某个地方读到过,说数值运算要快得多。这仍然是真的吗

或者,大多数编译器是否足够聪明,可以转换以下内容:

int结果=0;

对于(int i=0;i算法:到目前为止,地球上没有一个编译器能为您选择更好的算法。太多的人在基准测试后匆忙跳转到C中重写部分,而他们本应该真正考虑替换他们首先使用的算法。

没有人能列举C中的每一个优化ompiler能做到。(有很多)你有更具体的例子吗?对不起,我想我的问题不是针对某个特定的编译器或某个特定的算法。我想问一个一般性的问题,希望从像你们这样的优秀开发人员那里学到一些很酷的代码片段。如果你知道一点汇编知识,你自己就不难知道编译器是否能够完成某个特定的选项但是如果我查看程序集或.NET的IL,我仍然不会首先考虑编写
string.length==0
(假设此优化确实有效)。
string.length==0
string==0不一样。”
因为前者会在
string
null
时引发异常,而后者则不会。请改用
string.IsNullOrEmpty()
。哦,你会惊讶的……编译器实际上可以(在某些情况下)认识到你在做什么,并选择一个更好的算法…另一方面,编译器也可能愚蠢得令人惊讶,错过了对人类程序员来说微不足道的事情…@JoshuaK,在我看来,这似乎是一个没有区别的区别。要么编译器选择了一个更好的算法,要么没有。常数折叠是另一个例子示例:更好的算法包括可计算常数的预计算,这是代码提升的一个极端情况。在讨论中新引入“智能”一词实际上没有任何意义。@Voo不使用浮点,因为这将破坏浮点关联性。但对于整数,有一种称为“节点拆分”的技术编译器经常使用哪些方法来最大化ILP以进行缩减操作。@是的,确实如此。:)这是一系列高度专业化的优化方法之一,编译器通过模式匹配“识别”任务。然后用编译器创建者编写的高度优化的预编码算法替换它。