【发布时间】:2020-03-15 00:41:27
【问题描述】:
是否可以在 C# 中将 bool 转换为 byte 或 int(或任何整数类型,真的)无需分支?
换句话说,这不够:
var myInt = myBool ? 1 : 0;
我们可能会说我们想将bool 重新解释为底层byte,最好用尽可能少的指令。目的是避免分支预测失败,如 here 所示。
【问题讨论】:
-
我要补充一点,2 条目
Dictionary<bool, byte>感觉有点矫枉过正。对于我们正在尝试做的事情来说,基于哈希的查找似乎很重要。 -
“目的是避免分支预测失败,如此处所示” -- 你是否有任何证据表明你确实需要 这样做? IE。你有一个测量性能问题,你已经明确确认是100%由所描述的分支预测问题引起的?底线:您可以使用不安全的代码进行强制转换,但您必须内联执行,否则方法调用可能会导致与错过分支一样多的开销,即使那样您仍然必须处理无法保证的问题什么值存储在
bool中。您不能依赖1来获得true值。 -
@PeterDuniho 实际上,我没有对
true值做出任何假设,除非它们是非零的。至于测量:在我看来,链接的问题及其接受的答案很好地涵盖了这一点。否则,您可能会将其视为理论练习,只要将其应用于特定场景即可进行测量。假设当分支预测失败被确定为一个问题时,我希望有一个可用的解决方案。是的,这需要非常高效的内联内容! -
“需要非常高效的内联内容” -- 并非如此。大多数分支预测问题可以通过重构数据来解决。在我看来,您的推车至少比马领先两步(没有实际问题,并且您已经决定了您认为需要什么解决方案,即使您没有要衡量的问题) . :) 也就是说,我已经在下面的回答中解决了避免
bool测试的最简单有效的方法。 -
@PeterDuniho 虽然完全采取不同路线的建议很好也很受欢迎,但我认为有空间解决有趣的问题是件好事,即使它们可以在某些或所有情况下被规避。跨度>
标签: c# int boolean reinterpret-cast branch-prediction