【发布时间】:2013-06-10 07:49:20
【问题描述】:
在 C 或 C++ 中是否有比 x >= start && x <= end 更快的方法来测试一个整数是否介于两个整数之间?
更新:我的特定平台是 iOS。这是框模糊功能的一部分,该功能将像素限制为给定正方形中的圆形。
更新:在尝试accepted answer 之后,我在一行代码上的速度比正常的x >= start && x <= end 方式快了一个数量级。
更新:这是使用 XCode 汇编程序的前后代码:
新方式
// diff = (end - start) + 1
#define POINT_IN_RANGE_AND_INCREMENT(p, range) ((p++ - range.start) < range.diff)
Ltmp1313:
ldr r0, [sp, #176] @ 4-byte Reload
ldr r1, [sp, #164] @ 4-byte Reload
ldr r0, [r0]
ldr r1, [r1]
sub.w r0, r9, r0
cmp r0, r1
blo LBB44_30
老路
#define POINT_IN_RANGE_AND_INCREMENT(p, range) (p <= range.end && p++ >= range.start)
Ltmp1301:
ldr r1, [sp, #172] @ 4-byte Reload
ldr r1, [r1]
cmp r0, r1
bls LBB44_32
mov r6, r0
b LBB44_33
LBB44_32:
ldr r1, [sp, #188] @ 4-byte Reload
adds r6, r0, #1
Ltmp1302:
ldr r1, [r1]
cmp r0, r1
bhs LBB44_36
减少或消除分支如何提供如此显着的加速,真是令人惊讶。
【问题讨论】:
-
你为什么担心这对你来说不够快?
-
谁在乎为什么,这是一个有趣的问题。只是为了挑战而挑战。
-
@SLaks 所以我们应该盲目地忽略所有这些问题,只说“让优化器来做?”
-
问这个问题的原因并不重要。这是一个有效的问题,即使答案是否
-
这是我的一个应用程序功能的瓶颈
标签: c++ c performance math