От чего зависит, почему, какой из языков шустрее?
Железо в данном контексте не рассматривается! Мы понимаем, что время выполнения кода зависит от частоты и архитектуры процессора, памяти, шины, диска итд.. .
Например:
пустой цикл от 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;
Другие языки программирования и технологии
Скорость выполнения кода на разных языках программирования?
i520m, турбо отключен, хотя в принципе не важно - результат даже на древнем пне будет тот же ;)
Cи
> 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% на более "шустром" языке ;)
Cи
> 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% на более "шустром" языке ;)
Михаил, а вы всегда цикл делаете по переменной типа double?
Вы вообще соображаете что это означает?
Вы вообще соображаете что это означает?
Язык ассемблера вне конкуренций
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 мс.
===============================================
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
Но это будет сильно зависеть и от производительности процессора.
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))
DisableDebugger
x=ElapsedMilliseconds()
For i=0 To 1000000000 : Next
MessageRequester("", Str(ElapsedMilliseconds()-x))
Вот уже делалось такое сравнение
playground.ru/redirect/bablogon.net/view.php?p=70
playground.ru/redirect/bablogon.net/view.php?p=70
Похожие вопросы
- Pascal abc и Pascal одно и тоже? Или разные языки программирования?
- Объясните новичку в чем отличие у разных языков программирования.
- А какие языки программирования изучали в 80х и на чём вы их изучали?
- Двоичный код быстрее языков программирования по типу c++? (Я знаю что эти языки тоже написаны на двоичном коде)
- Добрый день. Компьютер все языки программирование понимает как двоичный код ( если я не ошибаюсь).
- Какой язык программирования выбрать для изучения для начинающего ? (внутри)
- И снова про языки программирования ^_^ Поправьте, если я ошибаюсь где-то.
- С какого языка программирования начать?
- Какой язык программирования следует изучить в первую очередь, если в программировании вообще ничего не понимаешь?
- Виды языков программирования