如果在C ++中,无分支将是什么样子?
|
我意识到我在该领域非常缺乏知识(以一种怪异的方式说我不知道杰克)。
是否有关于如何以及何时使用它们的文档?
没有找到相关结果
已邀请:
3 个回复
桔适丛
,
和
,它们根据条件执行操作。比较中的标志。 一个非常简单的例子是(是的,这个例子是如此简单,以至于永远都不会写这样的东西,只是为了清楚地说明这一点):
现在,一个简单的x86编译器可能会将其编译为:
优化的x86编译器会将其分解为以下无分支代码(或类似代码):
在这里可以找到更复杂的示例。 但是,这是编译器将要执行的事情,您不必担心自己(至少在不分析编译器输出的情况下)。但是,如果要求代码必须无分支无误,则C ++不能提供足够的控制来做到这一点,因此您需要使用(内联)汇编。
糖固傻染
渐首洽陈染
这是最慢的版本,在最坏的情况下它可能涉及2个分支,这是二进制逻辑失败的地方。在我的3770k上,它对随机数据的平均处理能力约为200MIPS。 (这里和之后-每个测试是随机填充2mb数据集的1000次尝试的平均值) 下一个依赖于模运算符,其速度介于第一和第三之间,但绝对更快-600 MIPS:
下一个是无分支方法,它仅涉及数学,因此仅涉及数学。它根本不假设跳转指令:
这确实应该做的,并且表现得非常好。相比之下,性能估计为1000 MIPS,比分支版本快5倍。由于缺少本地2位带符号的int支持,因此分支版本的速度可能有所降低。但是在我的应用程序中,它本身就是一个很好的版本。 如果这还不够,那么我们可以做一些特别的事情。接下来称为查找表方法:
在我的情况下,一个三位一体仅占用了2位,因此lut表只有2b * 4 = 8个字节,值得尝试。它适合高速缓存,工作速度高达1400-1600 MIPS,这是我的测量精度下降的地方。这是快速数学方法的1.5倍加速。那是因为您只有预先计算的结果和单个“ 11”指令。不幸的是,缓存很小,并且(如果索引长度大于几位)您将无法使用它。 所以我想我回答了您的问题,关于分支/无分支代码是什么样的。答案要好得多,并提供详细的示例,实际应用和实际性能测量结果。