auto
能提高性能吗?”的评论中,有一条被投票数很高的评论建议使用auto
“使无意中的不良反应变得不太可能”,作为答案。我以前从未注意到这个术语。我猜它在某种程度上与优化相反。任何人能否给出更详细的定义?在编程的上下文中,这是什么意思?糟糕的代码会是什么样子?
auto
能提高性能吗?”的评论中,有一条被投票数很高的评论建议使用auto
“使无意中的不良反应变得不太可能”,作为答案。我以前从未注意到这个术语。我猜它在某种程度上与优化相反。这主要是一个说法游戏,悲观主义者是乐观主义者的反义词。而悲观化是指编写不太优秀的代码。
编译器和程序员都可以通过使用糟糕的构造来将代码悲观化,例如在不需要时复制东西。 auto
关键字至少会确保您获得“最接近的类型”,因此不会进行(不必要的)类型转换。
请注意,当代码“不太优化”时,出于无益处的原因悲观化是错误的:
如果说“我们花了六个月来优化它,它会运行0.5%更快”,那么这不算是悲观化。除非强制要求提高0.5%的速度,否则在其上花费六个月可能是浪费时间。
此外,所需的功能(如安全性)不属于悲观化:“代码比可能能够实现的更慢,因为我们使其更加安全。”
调试版本不是“最劣”的,因为它具有用于捕获null
指针引用以及检查数组访问索引等内容的断言。只要这些断言和检查是这样编写的,即在启用发布模式时会“消失”。[如果您的代码正在运行核电站,则可能永远不希望出现崩溃,请参见上面的“安全性”]
我曾经看到过一个旧的例子,其中包含以下C字符串循环:
char str [large_number] = "... several kilobytes of text (read from file) ... ";
for(char *p = str; p < str+strlen(str); p++)
{
... do stuff with p ...
}
如果 do stuff with p
很复杂,编译器将无法意识到 strlen
是一个常量值,并且会在每次循环迭代中执行 strlen
。 如果我们这样做,循环会运行快得多:
for(char *p = str, *e = str+strlen(str); p < e; p++)
{
... do stuff with p ...
}
[不好意思,这并不是 auto
的示例]
悲观优化并不只是提供效率不尽如人意的表现。
一般而言,它是在做某件事情,通常是为了提高性能,但实际上却降低了性能。虽然这并非绝对必要,但通常意味着结果实际上比你只做些简单明显的事情要糟糕得多。
在这种情况下,使用 auto
来指定变量类型是简单而明显的 - 无论它是否精确最佳,它都建立了基准性能水平。当您明确指定类型时,您基本上只有两个选择:明确定义与 auto
推导出的相同类型(获得完全相同的性能),或者指定其他类型(在这种情况下,实际上只有两种可能性:它根本无法工作,或者会进行某种转换,几乎肯定会降低性能)。
总结:悲观优化通常不仅仅是“获得次优的性能”,通常意味着“做额外的工作(可能是为了提高性能)实际上会降低性能。”
auto
之前,你可能会对返回类型做出不恰当的假设,导致过度昂贵且完全不必要的类型转换。那将是一种负优化。 - AndyG