Скорость работы эквивалентного кода на Си и Паскаль
Добавлено: 18 дек 2008, 23:03
По мотивам поста https://shgpi.edu.ru/forum/viewtopic.php?p=36#p36 решил сравнить эффективность генерации машинного кода компиляторами gcc и freepascal. Ожидания оправдались с точностью до наоборот.
Итак, программа на Си test.c, реализующая тривиальный перебор:
Компилируем: gcc test.c -otest
Запускаем: time -f "%E" ./test
Получаем:
Ну, думаю, аналог на паскале пропилит минуту и больше, ибо общеизвестная истина. Ага, щазз.
Аналогичная вышеприведенной программа на Паскале test.pp:
Компилируем: fpc test.pp
Запускаем: time -f "%E" ./test
Получаем:
Программа на паскале работает в 3 раза быстрее программы на Си!
Для чистоты эксперимента переписал код той и другой программы для приведения его к общему знаменателю:
На Си:
На Паскале:
Ничего не поменялось, паскалевская программа опять бьет сишную по скорости в три раза. Перенос сишных переменных i,k в глобальную область ситуацию не изменил. В целом, как давнего поклонника паскаля, меня такая ситуация устраивает, хотя кажется совершенно ненормальной. Предлагаю всем заинтересованным лицам найти причину столь парадоксальных результатов. Возможно, где-то просто кроется тривиальная ошибка.
P.S.
компилятор паскаля - fpc 2.2.2, оптимизация - использование регистровых переменных
компилятор си - gcc 4.1.1, оптимизация - использование регистровых переменных
Итак, программа на Си test.c, реализующая тривиальный перебор:
- Код: Выделить всё
#include <stdio.h>
int main ()
{
long int register i,k;
puts("Test begin");
for(i=0; i<=2000000000L; i++) for(k=0;k<=10;k++);
puts("Test end");
return 0;
}
Компилируем: gcc test.c -otest
Запускаем: time -f "%E" ./test
Получаем:
- Код: Выделить всё
Test begin
Test end
0:52.90
Ну, думаю, аналог на паскале пропилит минуту и больше, ибо общеизвестная истина. Ага, щазз.
Аналогичная вышеприведенной программа на Паскале test.pp:
- Код: Выделить всё
{$mode objfpc}
var i,k:longint;
begin
writeln('Test begin');
for i:=0 to 2000000000 do for k:=0 to 10 do;
writeln('Test end');
end.
Компилируем: fpc test.pp
Запускаем: time -f "%E" ./test
Получаем:
- Код: Выделить всё
Test begin
Test end
0:15.90
Программа на паскале работает в 3 раза быстрее программы на Си!
Для чистоты эксперимента переписал код той и другой программы для приведения его к общему знаменателю:
На Си:
- Код: Выделить всё
#include <stdio.h>
int main ()
{
long int register i,k;
puts("Test begin");
i=0;
while (i<=2000000000L) {
i++;
k=0; while (k<=10) k++;
}
puts("Test end");
return 0;
}
На Паскале:
- Код: Выделить всё
{$mode objfpc}
var i,k:longint;
begin
writeln('Test begin');
i:=0;
while i<=2000000000 do begin
inc(i);
k:=0; while k<=10 do inc(k);
end;
writeln('Test end');
end.
Ничего не поменялось, паскалевская программа опять бьет сишную по скорости в три раза. Перенос сишных переменных i,k в глобальную область ситуацию не изменил. В целом, как давнего поклонника паскаля, меня такая ситуация устраивает, хотя кажется совершенно ненормальной. Предлагаю всем заинтересованным лицам найти причину столь парадоксальных результатов. Возможно, где-то просто кроется тривиальная ошибка.
P.S.
компилятор паскаля - fpc 2.2.2, оптимизация - использование регистровых переменных
компилятор си - gcc 4.1.1, оптимизация - использование регистровых переменных