【发布时间】:2011-04-06 15:58:14
【问题描述】:
我明白为什么Duff's device 比可以展开但未优化的普通循环代码更快。但我还不明白如何编译代码。
我想这是关于 switch 语法的一个技巧。但现在不是了。
switch句中怎么能存在do while句?很奇怪。
有谁可以解释一下吗?
编辑: 另一个问题。 为什么 duff 使用 8?它可以是 16、65536 或其他。因为代码大小?还有别的原因吗?例如,缓存或流水线的好处。
【问题讨论】:
-
“我明白为什么 Duff 的设备比没有优化的普通代码要快。”它不是。它可能只会让编译器和人类一样感到困惑,从而可能导致更慢代码。即使对 Duff 的设备有不同的支持,你也不需要如此糟糕的速度,你需要使用这种可憎的东西。跟我重复一遍。你不需要使用这个可憎的。
-
Duff 的设备 过去 比普通代码快(至少在某些平台上)——现在几乎没有了。在大约 10 年前我们在 Windows PC 和 MSVC 上进行的一个项目中,结果证明它比优化的普通代码慢。
-
真正的教训是相信你的编译器。不要以牺牲可读性和可维护性为代价来追逐性能边际收益的可能性(即使在这种情况下也是如此)。任何时候你必须就 SO 提出问题以理解一段代码或让它编译,你可能不应该尝试使用它。
-
@Hogan - 您是否声称 C 和 C++ 之间存在一些影响 Duffs 设备的差异?我能想到的唯一一件事就是与在开关/循环中声明的局部变量的范围、构造和销毁有关,这几乎肯定不是问题。
-
IMO 问题不在于 Duff 的设备,而是您不应该担心的任何类型的手动循环展开。在那些非常罕见的情况下,当您确实手动展开循环以查看它是否优于优化器(有时会这样做)时,您的循环可能不是展开程度的倍数。此时,您可能会选择使用 Duff 的设备,而不是一堆 goto,正是因为它可以让编译器优化操作的选择和跳转部分。不过,我不明白为什么人们会对有人能走到这一步的想法如此震惊。
标签: c++ c switch-statement duffs-device