Другие языки программирования и технологии

Скорость выполнения кода на разных языках программирования?

От чего зависит, почему, какой из языков шустрее?

Железо в данном контексте не рассматривается! Мы понимаем, что время выполнения кода зависит от частоты и архитектуры процессора, памяти, шины, диска итд.. .

Например:

пустой цикл от 0 до 1 000 000 000 на С# выполняется 3,226 секунды

пустой цикл от 0 до 1 000 000 000 на встроенном языке 1С Предприятие 8.2 выполняется 990,321 секунд

С# быстрее 1С в 307 раз.... без всяких обращений к БД.. . просто пустой цикл.... тест выполнялся на intel i7-2640M

Кто на чем кодит? замерьте время, сообщите пожалуйста результаты.

Код на С#

double i, max;

max = 1 000 000 000;
i = 0;

DateTime dateStart = DateTime.Now;

while (i < max)
{

i = i + 1;

}

DateTime dateStop = DateTime.Now;

TimeSpan Rezult = dateStop - dateStart;

Код на 1С Предприятие 8.2:

обMSScriptControl = Новый COMОбъект ("MSScriptControl.ScriptControl");
обMSScriptControl.language = "javascript";

НачалоТеста = обMSScriptControl.eval("new Date().getTime()");

сч = 0;
Пока сч < 1 000 000 000 Цикл

сч = сч + 1;

КонецЦикла;

Результат = (обMSScriptControl.eval("new Date().getTime()") - НачалоТеста) / 1000;
Gor Avetisyan
Gor Avetisyan
88
i520m, турбо отключен, хотя в принципе не важно - результат даже на древнем пне будет тот же ;)


> gcc test.c -O2 -std=c99
> ./a.out
1000000000
real 0m0.038s <---
user 0m0.000s
sys 0m0.000s

И да, будет быстрее ассемблера

> tail -n 10 test.c && gcc test.c -O2 -std=c99 -S -masm=intel && tail test.s
выдает
gcc version 4.7.2

uint64_t max = 1000000000;
uint64_t i = 0;
while (i < max){
i = i + 1;
}
printf("%d",i);
return 0;
}

call __main
lea rcx, .LC0[rip]
mov edx, 1000000000 <-- результат
call printf

Ведь результат можно посчитать еще при компиляции - что в этом случае и делается.

Очень многое зависит именно от компилятора - в picoc, ch (интерпретатор си) или древнем "Turbo C++"
все будет выглядеть иначе. И для тогоже питона есть такая славная вещь, как cython.
Или numpy, numba в качестве библиотек для всевозможный расчетов.
Т. е библиотеки на Си, быстрее всяких велосипедов ("длинная арифметика" уже встроенна) и при этом удобны в пользовании.

А вообще, где смысл микробенчмарков?
Я вот тоже недавно сравнивал эффективность инструментов. Каким быстее забивать гвозди:
победила кувалда - достаточно 1 точного удара
на почетном втором месте - молоток
а микроскоп, как и стеклорез - полная фигня, или толком не забиваюи или вообще ломаются!! 1

"шустрость языка" - это по крайней мере
время разработки + (время выполнения кода) * клч. выполнений

И часто время разработки - довольно дорогой ресурс.

Скажем, нужно раз в день обрабатывать несколько гигов данных весьма произвольного формата.
Предположим, разработка на "не Си" займет 1 день, при этом время выполнения - 5 минут.
На Си - как минимум в 3 раза дольше, время выполнения - да хоть 1 сек (как правило, реальная разница намного меньше ;) )
Получаем:
24*3600 + x*300 = 24*3600*3 + x*1 (где х нужное кол. выполнений)
т. е нужно 577 раз обработать эти несчастные данные, прежде чем супер-оптимированная программа будет "быстрее".
За 1.5 года и формат и требывания могут изменится (и не один раз) .

А программы, заточенные в основном на интеракцию с пользователем или
вызывающие функций из системной библиотеки / GUI, вообще большую часть времени ждут результатов.
Один вызов winapi "стоит" как минимум пары сотен инструкций - еще десяток другой особо ничего не изменят.
Ну и правило 10% кода выполняются 90% времени еще никто не отменял, никто не мешает написать эти 10% на более "шустром" языке ;)
Валерий Коротков
Валерий Коротков
2 026
Лучший ответ
Михаил, а вы всегда цикл делаете по переменной типа double?
Вы вообще соображаете что это означает?
Юрий Черкасов
Юрий Черкасов
57 422
Язык ассемблера вне конкуренций
Delphi 7: Intel Quad Q9500 / 2GB
===============================================
procedure TForm1.Button1Click(Sender: TObject);
Var
i: Cardinal;
T1,T2: TTime;
begin
i:=0;
T1:=Now();
while i<1000000000 do inc(i, 1);
T2:=Now();
Label1.Caption := IntToStr(MilliSecondOf(T2-T1));
end;
===============================================
Результат: в среднем 365 мс.
Lazarus

var
i: longint;
d,d1: Longint;
begin
d := gettickcount;
for i := 0 to 1000000000 do ;
d1:=gettickcount;
Edit1.Text := IntToStr(D);
Edit2.Text := IntToStr(d1-d);
end;

результат = 4.228
Но это будет сильно зависеть и от производительности процессора.
Пустой цикл на PureBasic выполняется за 2525 мс.

DisableDebugger
x=ElapsedMilliseconds()
For i=0 To 1000000000 : Next
MessageRequester("", Str(ElapsedMilliseconds()-x))
Вот уже делалось такое сравнение

playground.ru/redirect/bablogon.net/view.php?p=70