首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速模10 (C)

快速模10 (C)
EN

Stack Overflow用户
提问于 2018-04-27 16:00:49
回答 4查看 3.8K关注 0票数 1

我正在寻找一个快速的模块化10算法,因为我需要加快我的程序,在循环中做许多模块操作。

我已经检查了此页,它比较了一些替代方案。据我正确理解,T3是最快的。我的问题是,x % y使用T3技术会是什么样子?

为了简单起见,我在这里复制了T3技术,以防链接中断。

代码语言:javascript
复制
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 000m=1000

看起来是这样的:

代码语言:javascript
复制
for (i = 1; i <= n; i++) {
        D[(i%10)*m] = i;
        for (j = 1; j <= m; j++) {
           ...
        }
}
EN

回答 4

Stack Overflow用户

发布于 2018-04-27 16:22:58

下面是您可以编写的最快的模块化10功能:

代码语言:javascript
复制
unsigned mod10(unsigned x)
{
    return x % 10;
}

下面是曾经编译过的内容:

代码语言:javascript
复制
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

注意,缺少除法/模数指令、神秘常量、最初用于复杂数组索引的指令的使用等等。不用说,编译器知道很多使程序尽可能快的技巧。在这样的任务上,你很少能打败它。

票数 12
EN

Stack Overflow用户

发布于 2018-04-27 16:13:12

你很可能无法打败编译器。

调试生成

代码语言:javascript
复制
//     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  

零售建筑(做一些忍者的数学.)

代码语言:javascript
复制
//    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
票数 1
EN

Stack Overflow用户

发布于 2018-04-27 16:03:33

代码不是模块化的直接替代品,它在这种情况下替代了模块化。您可以类推地编写自己的mod (对于ab > 0):

代码语言:javascript
复制
int mod(int a, int b) {
    while (a >= b) a -= b;
    return a;
}

…但是,这是否比%快,这是一个非常值得怀疑的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50066237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档