首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x32 ELF在x64操作系统上的除法性能

x32 ELF在x64操作系统上的除法性能
EN

Stack Overflow用户
提问于 2019-08-07 08:23:48
回答 1查看 106关注 0票数 3

在下面的示例中,在64位架构上运行32位ELF更快,我不明白为什么。我试了两个例子,一个用除法,另一个用乘法。表现如预期,然而,该部门的表现是惊人的。

我们在程序集中看到编译器正在调用_alldiv,它在32位体系结构上模拟64位划分,所以它必须比简单地使用程序集指令idiv慢。所以我不明白我得到的结果:

我的设置是: Windows 10 x64,Visual 2019

来计时我使用Measure-Command { .\out.exe }的代码

  • 乘法
    • 32位ELF: 3360毫秒
    • 64位ELF: 1469毫秒

  • 除法
    • 32位ELF: 7383毫秒
    • 64位ELF: 8567毫秒

代码

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>
#include <Windows.h>

volatile int64_t m = 32;
volatile int64_t n = 12;
volatile int64_t result;

int main(void)
{
    for (size_t i = 0; i < (1 << 30); i++)
    {
#       ifdef DIVISION
        result = m / n;
#       else 
        result = m * n;
#       endif
        m += 1;
        n += 3;
    }
}

64位拆卸(除法)

代码语言:javascript
复制
    for (size_t i = 0; i < (1 << 30); i++)
00007FF60DA81000  mov         r8d,40000000h  
00007FF60DA81006  nop         word ptr [rax+rax]  
    {
        result = m / n;
00007FF60DA81010  mov         rcx,qword ptr [n (07FF60DA83038h)]  
00007FF60DA81017  mov         rax,qword ptr [m (07FF60DA83040h)]  
00007FF60DA8101E  cqo  
00007FF60DA81020  idiv        rax,rcx  
00007FF60DA81023  mov         qword ptr [result (07FF60DA83648h)],rax  
        m += 1;
00007FF60DA8102A  mov         rax,qword ptr [m (07FF60DA83040h)]  
00007FF60DA81031  inc         rax  
00007FF60DA81034  mov         qword ptr [m (07FF60DA83040h)],rax  
        n += 3;
00007FF60DA8103B  mov         rax,qword ptr [n (07FF60DA83038h)]  
00007FF60DA81042  add         rax,3  
00007FF60DA81046  mov         qword ptr [n (07FF60DA83038h)],rax  
00007FF60DA8104D  sub         r8,1  
00007FF60DA81051  jne         main+10h (07FF60DA81010h)  
    }
}

32位拆卸(除法)

代码语言:javascript
复制
    for (size_t i = 0; i < (1 << 30); i++)
00A41002  mov         edi,40000000h  
00A41007  nop         word ptr [eax+eax]  
    {
        result = m / n;
00A41010  mov         edx,dword ptr [n (0A43018h)]  
00A41016  mov         eax,dword ptr ds:[00A4301Ch]  
00A4101B  mov         esi,dword ptr [m (0A43020h)]  
00A41021  mov         ecx,dword ptr ds:[0A43024h]  
00A41027  push        eax  
00A41028  push        edx  
00A41029  push        ecx  
00A4102A  push        esi  
00A4102B  call        _alldiv (0A41CD0h)  
00A41030  mov         dword ptr [result (0A433A0h)],eax  
00A41035  mov         dword ptr ds:[0A433A4h],edx  
        m += 1;
00A4103B  mov         eax,dword ptr [m (0A43020h)]  
00A41040  mov         ecx,dword ptr ds:[0A43024h]  
00A41046  add         eax,1  
00A41049  mov         dword ptr [m (0A43020h)],eax  
00A4104E  adc         ecx,0  
00A41051  mov         dword ptr ds:[0A43024h],ecx  
        n += 3;
00A41057  mov         eax,dword ptr [n (0A43018h)]  
00A4105C  mov         ecx,dword ptr ds:[0A4301Ch]  
00A41062  add         eax,3  
00A41065  mov         dword ptr [n (0A43018h)],eax  
00A4106A  adc         ecx,0  
00A4106D  mov         dword ptr ds:[0A4301Ch],ecx  
00A41073  sub         edi,1  
00A41076  jne         main+10h (0A41010h)  
    }
}

编辑

为了进一步研究克里斯·多德,我对代码做了如下修改:

代码语言:javascript
复制
volatile int64_t m = 32000000000;
volatile int64_t n = 12000000000;
volatile int64_t result;

这一次我得到了以下结果:

  • 除法
    • 32位ELF: 22407毫秒
    • 64位ELF: 17812毫秒

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-08 03:15:54

如果你看一下x86处理器的指令时序,就会发现在最近的英特尔处理器上,64位的分割是32位除法的3-4倍--如果你看一下alldiv的内部部分(上面注释中的链接),你的值总是适合32位的,它将使用一个32位的除法.

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

https://stackoverflow.com/questions/57389985

复制
相关文章

相似问题

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