什么是悲观?
What is pessimization?
关于问题 的评论获得了很多票,并建议将“使其不太可能无意中悲观化”作为答案。我以前从来没有注意到这个词。我想这在某种程度上与优化相反。
谁能给出更详细的定义?
它在编程上下文中意味着什么?悲观的代码会是什么样子?
你可以查字典,比如 this page,它说:
pessimize (verb):
(transitive) To make (something) less efficient, such as a computer program.
这主要是文字游戏,悲观主义者与乐观主义者相反。悲观主义写的代码不是最优的。
编译器和程序员都可以通过错误的结构来悲观代码,例如在不需要时复制内容。 auto
关键字将至少确保您获得 "closest type",因此没有(不必要的)类型转换。
请注意,悲观化是指代码为 "not optimal":
没有任何好处
不是悲观"if we spent six months optimising this, it would run 0.5% faster"。除非要求快 0.5%,否则花六个月时间可能是浪费时间。
此外,所需的功能(例如安全性)并不悲观:"The code is slower than it possibly could be because we made it secure"。
调试版本是 mot "pessimal" 因为它有断言来捕获 NULL
指针取消引用和检查数组访问的索引等。只要这些断言和检查被编写成它们"disappear" 当你开启释放模式。 [如果您的代码是 运行 核电站,您可能永远不想崩溃,请参见上面的 "security"]
我见过的一个老例子是这个 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
指定变量的类型简单明了——无论它是否恰好是最优的,它都建立了性能的基线水平。 When/if 显式指定类型,基本上只有两种选择:显式定义 auto
会推导出的相同类型(获得完全相同的性能),或指定其他类型(在这种情况下实际上只有两种可能性:它根本不起作用,或者它会进行某种几乎不可避免地会损害性能的转换。
总结:悲观通常不只是"getting less that optimal performance"。通常是 "doing extra work (possibly in the hope of improving performance) that actually hurts performance."
关于问题
谁能给出更详细的定义? 它在编程上下文中意味着什么?悲观的代码会是什么样子?
你可以查字典,比如 this page,它说:
pessimize (verb):
(transitive) To make (something) less efficient, such as a computer program.
这主要是文字游戏,悲观主义者与乐观主义者相反。悲观主义写的代码不是最优的。
编译器和程序员都可以通过错误的结构来悲观代码,例如在不需要时复制内容。 auto
关键字将至少确保您获得 "closest type",因此没有(不必要的)类型转换。
请注意,悲观化是指代码为 "not optimal":
没有任何好处不是悲观"if we spent six months optimising this, it would run 0.5% faster"。除非要求快 0.5%,否则花六个月时间可能是浪费时间。
此外,所需的功能(例如安全性)并不悲观:"The code is slower than it possibly could be because we made it secure"。
调试版本是 mot "pessimal" 因为它有断言来捕获 NULL
指针取消引用和检查数组访问的索引等。只要这些断言和检查被编写成它们"disappear" 当你开启释放模式。 [如果您的代码是 运行 核电站,您可能永远不想崩溃,请参见上面的 "security"]
我见过的一个老例子是这个 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
指定变量的类型简单明了——无论它是否恰好是最优的,它都建立了性能的基线水平。 When/if 显式指定类型,基本上只有两种选择:显式定义 auto
会推导出的相同类型(获得完全相同的性能),或指定其他类型(在这种情况下实际上只有两种可能性:它根本不起作用,或者它会进行某种几乎不可避免地会损害性能的转换。
总结:悲观通常不只是"getting less that optimal performance"。通常是 "doing extra work (possibly in the hope of improving performance) that actually hurts performance."