Jos*_*eph 2 c math optimization integer-division micro-optimization
在C中,最好的方法是查看一个数字是否可以被另一个数除尽?我用这个:
if (!(a % x)) {
// this will be executed if a is divisible by x
}
Run Code Online (Sandbox Code Playgroud)
反正哪个更快?我知道这样做,即130%13将导致每10次做130/13.因此,只需要一个循环就有10个循环(我只想知道130是否可以被13整除).
谢谢!
Rob*_*obᵩ 25
我知道这样做,即130%13将导致每10次做130/13
梦呓.%在我用过的任何处理器上都没有这样的东西.它只执行130/13一次,并返回余数.
使用%.如果您的应用程序运行得太慢,请对其进行分析并修复任何太慢的应用程
对于两个任意数字,检查的最佳方法是检查是否a % b == 0.模数运算符具有基于硬件的不同性能,但您的编译器可以比您更好地解决这个问题.模数运算符是通用的,您的编译器将为您运行的任何硬件找出最佳的指令序列.
如果其中一个数字是常数,您的编译器可能会通过执行位移和减法的某种组合(主要是2的幂)进行优化,因为硬件div/mod比加法或减法慢,但在现代处理器上的延迟(已经大量的其他性能技巧隐藏了只有几纳秒的时间,所以你不必担心它.没有硬件通过重复划分来计算模数(一些旧的处理器通过重复的位移和减法进行划分,但它们仍然使用专用硬件,因此硬件执行它比使用软件模拟它更快).大多数现代ISA实际上在一条指令中计算除法和余数.
唯一可能有用的优化是除数是2的幂.然后,您可以使用&屏蔽低位(通过除数-1)并检查结果为零.例如,检查是否a可被8整除,a & 7 == 0是等效的.一个好的编译器会为你做这个,所以坚持坚持%.
在一般情况下,使用模运算符可能是最快的方法.有一些例外,特别是如果你对数字是否可以被2的幂整除感兴趣(在这种情况下可以使用按位运算),但是如果你只是使用,编译器应该自动选择它们%.对于任意值,你不太可能做得更好13.
另外,"每10次做130/13"是什么意思?它做了130 / 13一次.这正是所需要的.