Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2024, 16:02   #1
DeepFlake
Пользователь
 
Регистрация: 16.05.2024
Сообщений: 92
По умолчанию Сравнение языков по скорости

В книгах и интернете можно прочитать разные мнения насчёт скорости работы программ на разных языках программирования. Например, говорят, что код на Go очень медленный, что самые быстрые языки (то есть машинный код, генерируемый компиляторами этих языков) - С++ и Rust, что программы на Free Pascal и Ada значительно отстают по скорости работы от С++ и т.д. В одной книге про Java я прочитал, что программа на Java где есть расчёты легко уделывает по скорости неоптимизированный C++-код, а оптимизированный C++-код, конечно, быстрее Java-овского, но когда расчёты идут долго, то у Java включается внутренний оптимизатор и Java-программа вполне может сравниться по скорости с C++-кодом. и так далее.

Решил сам сравнить разные языки по скорости работы программ на них. Взял 6 языков, написал для каждого программу подсчёта количества простых чисел в заданном диапазоне от 2 до n.
Задал n=500000 (пятсот тысяч), для каждой программы сделал несколько запусков, из последовательности значений времени расчёта удалил эксцесс (максимальное значение), из оставшихся значений подсчитал среднее арифметическое.

Оказалось, что все 6 программ (на разных языках) справились с расчётом практически за одно и то же время - за 46 секунд (на другом компьютере конкретная цифра будет другая). Разница между самым быстрым и самым медленным языком не превышает полпроцента.

Если тестировать производительность на другом алгоритме (например где обработка текста), я думаю, разница между языками тоже будет небольшой. Получается, что все компиляторы производят хорошо оптимизированный код и разница между ними несущественная.

Вот результаты на моём компьютере времени подсчёта количества простых чисел в диапазоне от 2 до 500000 в секундах. Чем меньше значение - тем лучше:

Ada - 46.31405

C++ - 46.31438

Free Pascal - 46.3195

Rust - 46.3232

Java - 46.3939

Go - 46.5212

Исходный текст программ - в архиве в прикреплении к сообщению.
Однако, всё же видно, что новые языки (Java, Go, Rust) немного медленнее "старичков" C/C++, Pascal и Ada.
Вложения
Тип файла: zip benchmark1.zip (7.4 Кб, 3 просмотров)
DeepFlake вне форума Ответить с цитированием
Старый 11.08.2024, 16:06   #2
DeepFlake
Пользователь
 
Регистрация: 16.05.2024
Сообщений: 92
По умолчанию

Вот такой алгоритм расчёта:
На языке Free Pascal:
компилировать командой
fpc -O3 -Mobjfpc primes.pas

Код:
{ License: Public domain. }

program Primes;

uses sysutils;

var
    n, cnt, i, d : int64;
    start_tm, stop_tm : TDateTime;
    start_ms, stop_ms : comp;
    dur : double;

begin
    writeln( 'Подсчёт количества простых чисел в диапазоне от 2 до n.' );
    write( 'Введите целое число n >= 2 : ' );
    readln( n );

    start_tm := Now;

    cnt := 0 ;
    i := 2;
    while i <= n
    do
        begin
        d := 2;
        while (i mod d ) <> 0
        do
            begin
            inc(d);
            end;

        if d = i
        then
            begin
            inc(cnt);
            //writeln( d );
            end;

        inc(i);
        end;

    stop_tm := Now;
    start_ms := TimeStampToMSecs( DateTimeToTimeStamp( start_tm ) );
    stop_ms := TimeStampToMSecs( DateTimeToTimeStamp( stop_tm ) );
    dur := double( stop_ms - start_ms ) * 1.0e-3;

    writeln( 'Всего простых чисел: ', cnt );
    writeln( 'Продолжительность расчёта: ', dur:10:3, ' секунд.' );

end.
DeepFlake вне форума Ответить с цитированием
Старый 12.08.2024, 08:09   #3
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,009
По умолчанию

DeepFlake, нет смысла сравнивать какую-то скорость на каких-то языках. Каждый язык - под свою задачу.

Искусственными тестами можно на любом языке обогнать любой другой. Не учитывая кеши, потоки

Ещё есть такое понятие, как скорость разработки. Иногда нужен компромисс между скоростью разработки и скоростью работы.
А иногда сочетают - GUI накидали на питоне, а расчёты сделали на C++
Алексей1153 вне форума Ответить с цитированием
Старый 12.08.2024, 09:44   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,329
По умолчанию

Алексей1153
Цитата:
DeepFlake, нет смысла сравнивать какую-то скорость на каких-то языках. Каждый язык - под свою задачу.
Голосую - За.

Возьмите, например, задачи с ООП. Сколько избыточного кода и памяти используется в их решениях.

Даже ваш код можно ускорить, если проверять делители только до квадратного корня числа.
Код:
while (i mod d ) <> 0
do
      begin
      inc(d);
      end;
Это к тому, что алгоритм тоже имеет значение!
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.08.2024, 11:27   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,617
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Алексей1153
... алгоритм тоже имеет значение!
решающее...
digitalis вне форума Ответить с цитированием
Старый 12.08.2024, 11:49   #6
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,828
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Ada - 46.31405

C++ - 46.31438

Free Pascal - 46.3195

Rust - 46.3232

Java - 46.3939

Go - 46.5212
На самом деле это говорит лишь о том, что разница — в пределах погрешности. То есть все перечисленные языки плюс-минус одинаковы для такой простой задачи.

Кроме того, методика подсчета затраченного времени не вызывает доверия из-за неиспользования механизма счетчиков производительности. В данном тесте это обязательно.

Дополнительно, для Java хотелось бы узнать полное время, включающее запуск JVM и компиляцию, а также настройки JVM, отвечающие за оную (CompileThreshold в первую очередь). Аналогично — для других языков, что требует сооружения тестовой среды. Вот она-то и должна считать в реальном времени, поскольку нагрузка будет распределяться на разные процессы, и значение имеет суммарное время выполнения, включающее накладные расходы ОС. Ожидается, что Java должна с треском проиграть, да.

Короче, должно быть две колонки:
  • Производительность кода через счетчик
  • Суммарное затраченное время
Для остальных языков вторая колонка будет содержать время на действия ОС по подготовке исполняемого файла к выполнению, что включает в себя отображение его на память (надо полагать, размеры exe-шников у них сильно различаются) и инициализацию стандартной библиотеки (время на выполнение мусорного кода в ней).

Тогда и можно будет предметно говорить. А сейчас — баловство.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 12.08.2024, 12:21   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,758
По умолчанию

+ надо указывать компиляторы, а то окажется, что ada использует GCC со всеми оптимизациями от С/С++, Rust - LLVM, а Java - прогретый код JIT и т.д.
+ надо брать набор задач, а не одну тупую молотилку
+ надо сбрасывать кэша
+ ...
а так мерять можно любой результат намерять
p51x вне форума Ответить с цитированием
Старый 12.08.2024, 12:27   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,758
По умолчанию

посмотрел бенч - так там меряется один и тот же цикл, скорее всего даже машинный код сгенерированный будет один - что меряли?
p51x вне форума Ответить с цитированием
Старый 12.08.2024, 15:11   #9
DeepFlake
Пользователь
 
Регистрация: 16.05.2024
Сообщений: 92
По умолчанию

>там меряется один и тот же цикл, скорее всего даже машинный код сгенерированный будет один - что меряли?

измерял вот этот цикл while. Какой компилятор какой код генерирует на задаче где арифметические расчёты и ветвления. Оказалось что все компиляторы генерируют почти одинаковый машинный код .
Все языки хороши
DeepFlake вне форума Ответить с цитированием
Старый 12.08.2024, 15:13   #10
DeepFlake
Пользователь
 
Регистрация: 16.05.2024
Сообщений: 92
По умолчанию

>+ надо брать набор задач, а не одну тупую молотилку

подскажите на какой ещё задаче протестировать
DeepFlake вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли доказать, что бывают скорости больше скорости света challengerr Свободное общение 96 09.08.2015 08:08
Вопрос о скорости PDO ? Haroutweb PHP 1 25.08.2012 12:35
оптимизация по скорости sin Medved.tolik Помощь студентам 0 14.12.2011 23:43
График скорости как в DM dmitriegorovih Общие вопросы Delphi 5 30.01.2011 08:22
Сравнение скорости компиляторов Umen Обсуждение статей 13 05.10.2009 19:48