c++ - 试除法代码在 Windows 上运行 32 位比在 Linux 上运行 64 位快 2 倍

标签 c++ performance x86 benchmarking 32bit-64bit

我有一段代码在 Windows 上的运行速度比在 linux 上快 2 倍。 以下是我测量的时间:

g++ -Ofast -march=native -m64
    29.1123
g++ -Ofast -march=native
    29.0497
clang++ -Ofast -march=native
    28.9192
visual studio 2013 Debug 32b
    13.8802
visual studio 2013 Release 32b
    12.5569

好像真的差别太大了。

代码如下:

#include <iostream>
#include <map>
#include <chrono>
static std::size_t Count = 1000;

static std::size_t MaxNum = 50000000;

bool IsPrime(std::size_t num)
{
    for (std::size_t i = 2; i < num; i++)
    {
        if (num % i == 0)
            return false;
    }
    return true;
}

int main()
{
    auto start = std::chrono::steady_clock::now();
    std::map<std::size_t, bool> value;
    for (std::size_t i = 0; i < Count; i++)
    {
        value[i] = IsPrime(i);
        value[MaxNum - i] = IsPrime(MaxNum - i);
    }
    std::chrono::duration<double> serialTime = std::chrono::steady_clock::now() - start;
    std::cout << "Serial time = " << serialTime.count() << std::endl;

    system("pause");
    return 0;
}

所有这些都是在使用 windows 8 和 linux 3.19.5(gcc 4.9.2,clang 3.5.0)的同一台机器上测量的。 linux和windows都是64位的。

这可能是什么原因?一些调度程序问题?

最佳答案

您没有说 windows/linux 操作系统是 32 位还是 64 位。

在 64 位 linux 机器上,如果将 size_t 更改为 int,您会发现 linux 上的执行时间下降到与 windows 类似的值。

size_t 在 win32 上是 int32,在 win64 上是 int64。

编辑:刚刚看到你的 windows 反汇编。

您的 Windows 操作系统是 32 位版本(或者至少您已经编译为 32 位)。

关于c++ - 试除法代码在 Windows 上运行 32 位比在 Linux 上运行 64 位快 2 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983453/

相关文章:

ruby - 如何逐行读取大文本文件并将此流逐行附加到 Ruby 中的文件?

performance - 寻找最长的非负子数组

linux - 在 Linux IA-32 汇编程序 (gas) 上创建一个子字符串

c++ - 是否可以覆盖 boost::bimaps::bimap.left 的 "find"和 "erase"方法?怎么做?

c++ - operator new inside 命名空间

c++ - 重载 Rcpp 类中继承的方法

php - 与多个较小的 SQL 相比,使用连接执行单个 SQL SELECT 是否更有效?

c++ - 我什么时候可以自信地使用 -O3 编译程序?

c - 如何调试 x86 程序集

c - 为什么 Linux 不遵循 Unix 系统调用约定?