我正在寻找一个快速的模块化10算法,因为我需要加快我的程序,在循环中做许多模块操作。
我已经检查了此页,它比较了一些替代方案。据我正确理解,T3是最快的。我的问题是,x % y使用T3技术会是什么样子?
为了简单起见,我在这里复制了T3技术,以防链接中断。
for (int x = 0; x < max; x++)
{
if (y > (threshold - 1))
{
y = 0; //reset
total += x;
}
y += 1;
}关于评论,如果这不是真的比常规模式更快,我正在寻找至少比使用%快2倍的模块。我见过很多使用功率为2的例子,但是由于10不是,我如何才能让它工作呢?
编辑:
对于我的程序,假设我有2个循环,其中n=1 000 000和m=1000。
看起来是这样的:
for (i = 1; i <= n; i++) {
D[(i%10)*m] = i;
for (j = 1; j <= m; j++) {
...
}
}发布于 2018-04-27 16:22:58
下面是您可以编写的最快的模块化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注意,缺少除法/模数指令、神秘常量、最初用于复杂数组索引的指令的使用等等。不用说,编译器知道很多使程序尽可能快的技巧。在这样的任务上,你很少能打败它。
发布于 2018-04-27 16:13:12
你很可能无法打败编译器。
调试生成
// int foo = x % 10;
010341C5 mov eax,dword ptr [x]
010341C8 cdq
010341C9 mov ecx,0Ah
010341CE idiv eax,ecx
010341D0 mov dword ptr [foo],edx 零售建筑(做一些忍者的数学.)
// int foo = x % 10;
00BD100E mov eax,66666667h
00BD1013 imul esi
00BD1015 sar edx,2
00BD1018 mov ecx,edx
00BD101A shr ecx,1Fh
00BD101D add ecx,edx
00BD101F lea eax,[ecx+ecx*4]
00BD1022 add eax,eax
00BD1024 sub esi,eax发布于 2018-04-27 16:03:33
代码不是模块化的直接替代品,它在这种情况下替代了模块化。您可以类推地编写自己的mod (对于a,b > 0):
int mod(int a, int b) {
while (a >= b) a -= b;
return a;
}…但是,这是否比%快,这是一个非常值得怀疑的问题。
https://stackoverflow.com/questions/50066237
复制相似问题