我正在寻找一种快速的模 10 算法,因为我需要加速我的程序,该程序在循环中执行许多模运算。
我已经结帐了这一页 http://cc.davelozinski.com/c-sharp/use-the-modulus-operator-or-alternative它比较了一些替代方案。
据我正确理解,T3 是最快的。
我的问题是,如何x % y
看起来像使用T3技术?
为了简单起见,我在这里复制了 T3 技术,以防链接中断。
for (int x = 0; x < max; x++)
{
if (y > (threshold - 1))
{
y = 0; //reset
total += x;
}
y += 1;
}
关于评论,如果这不是真的比常规 mod 更快,我正在寻找比使用快至少 2 倍的模%
。
我见过很多使用 2 次方的例子,但由于 10 不是,我怎样才能让它工作呢?
Edit:
对于我的程序,假设我有 2 个 for 循环,其中n=1 000 000
and m=1000
.
看起来像这样:
for (i = 1; i <= n; i++) {
D[(i%10)*m] = i;
for (j = 1; j <= m; j++) {
...
}
}
这是您可以编写的最快的模 10 函数:
unsigned mod10(unsigned x)
{
return x % 10;
}
这是编译后的样子:
movsxd rax, edi
imul rcx, rax, 1717986919
mov rdx, rcx
shr rdx, 63
sar rcx, 34
add ecx, edx
add ecx, ecx
lea ecx, [rcx + 4*rcx]
sub eax, ecx
ret
请注意,缺少除法/模数指令、神秘的常量、使用最初用于复杂数组索引的指令等。不用说,编译器知道很多技巧,可以使您的程序尽可能快。你很少能在这样的任务中击败它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)