【问题标题】:Linux vs Windows performanceLinux 与 Windows 性能对比
【发布时间】:2017-10-28 20:56:58
【问题描述】:

我正在 Win7 和 Linux Ubuntu 16 上测试一些简单的基准计算来比较时间,奇怪的是,Win 似乎比 Linux 快得多。

Win 和 Linux x64 托管同一台机器,cpu 时钟设置相同。我在 Win 上使用带有 -O2(最大化速度)优化的 VC2010,在 Linux 上使用带有 -O3 的 gcc5。结果是 Win 为 2375 毫秒,Linux 为 2800 毫秒。即使使用 -Ofast 优化,Linux 也会滞后。无论如何,gcc 和 g++ 都给出相同的结果。

我解释这种行为的假设是 VC 和 Win 运行时针对 x86/64 进行了极大优化。

有人可以建议为什么会发生这种情况吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

#define Pk 41
#define Lmz 101
#define Mmz 101
#define Nmz 101

// input data
float US[Pk][Lmz][Mmz][Nmz], VS[Pk][Lmz][Mmz][Nmz], HS[Pk][Lmz][Mmz][Nmz], QS[Pk][Lmz][Mmz][Nmz], TS[Pk][Lmz][Mmz][Nmz];
float F_X[Mmz][Nmz];
float Zmz[Nmz];

// output data
float Q[Pk][Lmz][Mmz][Nmz];

void Init() {
    int h, k, j, i;

    for (h = 0; h < Pk; h++)
        for (k = 0; k < Lmz; k++)
            for (j = 0; j < Mmz; j++)
                for (i = 0; i < Nmz; i++) {
                    US[h][k][j][i] = 1+sin((float)i*j+i-k-h);
                    VS[h][k][j][i] = 2+cos((float)3*i*h-j+h*k);
                    HS[h][k][j][i] = 3+sin((float)2*i*k+j*h);
                    QS[h][k][j][i] = 4+cos((float)i+j+k+h+10);
                    TS[h][k][j][i] = 5+sin((float)(j+i)*k-h);
                }

    for (j = 0; j < Mmz; j++)
        for (i = 0; i < Nmz; i++)
            F_X[j][i] = sin((float)i*j-i+123);

    for (i = 0; i < Nmz; i++)
        Zmz[i] = cos((float)2*i);
}

void Calc() {
    int h, k, j, i;
    float Rs = 0, a = 0, Tp = 0, Tv = 0;
    for(h = 0; h < Pk; h++)
    {
        for(k = 0; k < Lmz; k++)
        {
            for(j = 0; j < Mmz; j++)
            {
                for(i = 0; i < Nmz; i++)
                {
                    a = (1.23 + US[h][k][j][i] / 0.321) * Rs * VS[h][k][j][i];
                    Tp = TS[h][k][j][i] * pow( 1000. / HS[h][k][j][i], 2./7. );
                    Tv = Tp * (1. + 0.6078 * QS[h][k][j][i]);
                    Q[h][k][j][i] = a - (0.5 * Tv + (1. - Zmz[k]) * 9.8 * F_X[j][i] / 0.321);
                }
            }
        }
    }
}

int main() {
    int h, k, j, i;
    clock_t timer;

    Init();

    timer = clock();
    Calc();
    printf("\ncalc time \t%f\n\n", (float)(clock() - timer));

    return 0;
}

【问题讨论】:

  • 数据太少,无法得出任何结论。您的测试非常简单,只持续不到三秒钟。您还使用了不同的编译器。
  • 您正在测量函数sincospow的不同实现的速度。与编译器几乎没有任何关系。与操作系统无关。
  • 贴出的代码编译不干净!使用:gcc -c -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11编译器输出40多个警告。
  • 关于:a = (1.23 + US[h][k][j][i] / 0.321) * Rs * VS[h][k][j][i];,因为Rs被初始化为0(应该初始化为0.0f)所以这个计算的结果总是0。
  • 这不是 applesapples 的比较,因为它们是不同的库

标签: c linux windows gcc


【解决方案1】:

我认为您的测试完全有效,测试结果准确。你没有做错任何事。您正在测试一个完整的工具链,而不仅仅是操作系统。造成这种差异的主要原因是 Linux 无法利用硬件加速来进行浮点运算这一令人遗憾的事实。或者图形。三角函数的实现可能存在差异,但我怀疑这些差异很小。大多数编译器提供的运行时只使用 Fortran 设计人员首先规定的原始实现,因为没有理由不这样做。

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2011-09-22
    相关资源
    最近更新 更多