Очень медленная скорость скомпилированной gcc C-программы под Linux - PullRequest
0 голосов
/ 17 октября 2018

У меня на компьютере две ОС с 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...