У меня на компьютере две ОС с i7-3770 @ 3,40 ГГц.Одна из них - последняя версия Linux Kubuntu 18.04, другая - Windows 10 Pro, работающая на том же жестком диске.
Я протестировал простую забавную программу, написанную на языке C, выполняющую некоторые арифметические вычисления из теории чисел.В Kubuntu, скомпилированном с gcc 7.3.0, в Windows, скомпилированном с gcc 5.2.0.построен по проекту MinGW-W64.
Результат поразительный, на Linux программа работала в 4 раза медленнее, чем на Windows.
В Windows истекшее время составляет всего 6 секунд.На Linux затрачено время 24 секунды!На том же оборудовании.
Я пытался на Kubuntu скомпилировать с некоторыми специфичными для процессора параметрами, такими как "gcc -corei7" и т. Д., Но ничего не помогло.В программе используется библиотека "math.h", поэтому компиляция выполняется с помощью "-lm" на обеих системах.Исходный код такой же.
Есть ли причина такой низкой скорости в Linux?
Более того, я скомпилировал этот же код и на более старой 32-битной машине с Core Duo T2250 @1,73 ГГц под Linux Mint 19 с gcc 7.3.0.Прошедшее время составило 28 секунд!Разница не так велика, чем у 64-битной машины, работающей на двух частотах под Linux.
Код sorce приведен ниже, вы можете скомпилировать его и протестировать.
/* Program for playing with sigma(n) and tau(n) functions */
/* Compilation of code: "gcc name.c -o name -lm" */
#include <stdio.h>
#include <math.h>
#include <time.h>
int main(void)
{
double i, nq, x, zacatek, konec, p;
double odx, soucet, delitel, celkem, ZM;
unsigned long cas1, cas2;
i=(double)0; soucet=(double)0; celkem=(double)0; nq=(double)0;
zacatek=(double)1; konec=(double)1000000; x=zacatek;
ZM=(double)16 / (double)10;
printf("\n Program for playing with sigma(n) and tau(n) functions \n");
printf("---------------------------------------------------------\n");
printf("Calculation is running in range from %.0lf to %.0lf\n\n\n", zacatek, konec);
printf("Finding numbers which have sigma(n)/n = %.3lf\n\n", ZM);
cas1=time(NULL);
while (x <= konec) {
i=1; celkem=0; nq=0;
odx=sqrt(x)+1;
while (i <= odx) {
if (fmod(x, i)==0) {
nq++;
celkem=celkem+x/i+i;
}
i++;
}
nq=2*nq-1;
if ((odx-floor(odx))==0) {celkem=celkem-odx;}
if (fabs(celkem - (ZM*x)) < 0.001) {
printf("%.0lf has sum of all divisors = %.3lf times the number itself (%.0lf, %.0lf)\n", x, ZM, celkem, nq+1);
}
x++;
}
cas2=time(NULL);
printf("\n\nProgram ended.\n\n");
printf("Elapsed time %lu seconds.\n\n", cas2-cas1);
return (0);
}