?

Log in

No account? Create an account
Предыдущий пост Поделиться Следующий пост
(без темы)
sceptic
slobin

Как я, наверное, уже рассказывал, у меня есть любимая бенчмарка для сравнения языков программирования. Поскольку я на той неделе поменял машину, мне захотелось погонять её на задаче большего размера. Раз машина выросла в три раза (на самом деле в четыре), я и входной файл тоже увеличил в три раза - с пяти мегов до пятнадцати. На самом деле соотношение не точное, поэтому большая часть программ стала немножко быстрее. Тем интереснее (в отрицательном смысле) те, которые стали медленнее.

Ставить задачу на русском языке ломы, поэтому объявим спецификцией текст перловой реализации - он был написан первым, он самый короткий, и вообще в каком-то смысле эталонный:

    while(<>) {
      foreach $word (split) {
        $total{$word}++;
      }
    }

    foreach $word (sort keys %total) {
      print "$word $total{$word}\n"
    }

Примечание 1а: мне пофигу, что программа будет делать со всякими там табуляциями и прочими управляющими символами. Пусть работает так, как принято в этом языке по умолчанию. Этот случай я не тестирую.

Примечание 1б: мне пофигу, пытается ли программа обрабатывать аргументы командной строки, а не только стандартный ввод. Пусть работает так, как принято в этом языке по умолчанию. Этот случай я не тестирую.

Примечание 2: желательно, чтобы в тестируемом языке были сплит, хеши и сортировка. Реально хеши пришлось писать руками в Плейн Си, сплит - в Окамле (один вариант) и Коммон Лиспе. В Схеме все три фичи были в библиотеках, написанных на самой Схеме.

Примечание 3: большая часть тестируемых языков имеет ровно по одной реализации. Для двух (Си и Си++) есть явно выделенная стандартная реализация (gcc), и ещё для двух (Коммон Лисп и Схема) выделенной реализации нет, поэтому я взял какие попало.

Результаты:

Языки чётко поделились на три группы. Первая - Плейн Си, он в своей группе один. Вторая - нормальные языки. Она довольно тесная и на более толстой задаче стала ещё тесней (разброс менее чем в два раза). Интересно, что в число нормальных вошли как интерпретируемые, так и компилируемые языки. Третья - тормоза. Тормоз месяца - Руби. Она и раньше (на маленькой задаче) была втрое медленнее конкурентов, а на большой стала впятеро медленнее. Абсолютный тормоз - Коммон Лисп. Он в сто раз (два порядка) медленнее эталонного Перла, и с ростом задачи стал ещё медленнее. Я не знаю, то ли я напрочь не умею писать на этим языке, то ли реализация попалась такая. Схема, напротив, с ростом задачи ускорилась вдвое. Впрочем, из класса тормозов это её не вывело. Правда, за время, прошедшее с прошлых замеров, я обновил версию интерпретатора и библиотек, может быть, дело в этом.

Такое трудноформализуемое свойство, как читабельнось: на первом месте скриптовая тройка - Перл, Питон и Руби. Что не удивительно - они именно под такие задачи заточены. На самом деле становится очевидно, что это три диалекта одного и того же языка, всё различие - в форме скобочек. Функциональные языки, как не печально это признавать, на третьем, потому что я использовал их не по назначению - для написания чисто последовательного кода. Когда думаешь про цикл, а пишешь вызов функции, ясности это не добавляет. Циклы, если уж их использовать, заслуживают синтаксиса. Все остальные - на втором месте.

Планы:

Попробовать Ди (он претендует быть нормальным компилируемым языком) и Жи с Хаскелем (эти абсолютно ненормальные; на них на обоих надо сделать по две программы - обычную процедурную с циклом по строкам и характерную для этих языков функциональную, где файл - это просто поток (в Хаскеле) или массив (в Жи) символов, а остальное - проблемы интерпретатора; не удивлюсь, если вторые версии окажутся быстрее).

Ссылки:

... Язык - это брод через реку времени ...

Метки:

  • 1
Не умеешь ли ты компилировать лисп под вин32?

1. Я вообще ничего не умею компилить под win32, я всё компилю под dos32 посредством djgpp.
2. Насколько я знаю, существует дохрена уже скомпилённых лиспов под win32. Тебе какой нужен?

... Ах, если бы любовь не знала правил! ...


Имеется в виду лисп-программа, написанная на лиспе под юниксом, которую хочется иметь под вин32.

Я не знаю, сколь портабельны разные лисповские программы между разными реализациями лиспа. Посмотри в документации данной конкретной программы, под какими лиспами она идёт, а потом смотри в документации данных конкретных лиспов, есть ли они под win32.

... Неравенство строгое, но справедливое ...


...А потом найди этот лисп, поставь его у себя и научись на ём программировать и компилировать. Угу.

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

... Купание в реке всегда беспрецедентно ...


Не понял. Зачем его себе ставить, если можно найти человека, понимающего в этом деле, с поставленным у него компилятором?

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

... Полная победа сил Добра над силами Разума ...


  • 1