如果我们让人类参与其中,编译器能否做的不仅仅是严格的语义等价优化?
编译器会直接忽略一些潜在的优化,因为它们在语义上可能不等效。
但是,它们也可能没问题,那么为什么不尝试检测并建议它们呢?检测可能涉及两个阶段的过程:编译时分析阶段和运行时分析阶段。
错误、警告和... 建议?
编译器已经对“警告”做了类似的事情,因为它们在每次编译期间都被汇集在一起,并且永远坐在列表中,直到您将它们解决给编译器满意为止。为什么没有“建议”或“建议的优化”部分以类似的方式运行,并有可能提高您的应用程序的性能?
如果编译器要分析布尔表达式的复杂性、估计的运行时间、单个操作数是真还是假的可能性等,那么它可以创建一个建议列表,例如表达式操作数的更好顺序,并呈现建议作为程序员的清单。然后,程序员可以单独处理它们,并决定忽略它们,或者让代码编辑器实现建议。
优化布尔表达式操作数顺序
考虑“短路逻辑表达式的优化”。因为操作数的顺序会影响哪个操作数可能被“短路”(即未调用),所以简单布尔表达式(即 A && B && C)中的操作数顺序是(我认为)编译器不会改变的东西如果任何操作数有副作用,则避免引入未知的副作用。
考虑一下:
char c = reader.ReadChar(); //Stream bs; const string NEWLINE;
while (!IsStringPresent( c, bs, NEWLINE ) && c != ',')
由于比较一个字符是(更快/不太复杂),它应该放在表达式的第一位,这样短路逻辑可以避免在遇到逗号时调用 IsStringPresent。同样,在这种情况下,逗号(每行很多)会比换行序列更频繁地出现。
char c = reader.ReadChar(); //Stream bs; const string NEWLINE;
if (c != ',' && !IsStringPresent( c, bs, NEWLINE )) //faster for short-circuit; plus ',' is encountered more often than newline
概括
客观地,可以根据“A 与 B 的错误触发短路的频率”和“计算 A 与 B 的成本,有利于更多昂贵的”。如果编译器可以在编译时、运行时或两者中确定其中任何一个的近似值,那么它可以确定一个特定的表达式可能是次优的,并且它可以为程序员创建一个建议的更改来实现.
今天有没有编译器做这样的事情?如果不是,为什么?