Ну, простые тесты на производительность уже были, это уже скучно. Теперь давайте что-то более сложное, что-то более приближенное к реальности.
Если на некотором ЯП результаты этого теста будут очень плохи, значит скорее всего на этом ЯП и ядро СУБД нормально реализовать не получится (либо это потребует очень больших усилий). Т.е. этот тест для, так называемых, ЯП претендующих на звание системных. По сути, тест на профпригодность ЯП на звание системного.
Итак задача:
Есть файл input в нем содержится массив целых беззнаковых 32битных чисел (ака uint32_t) в бинарном little endian виде. После завершения выполения приложения, должен быть файл output где в том же формате был бы записан отсортированный по возрастанию этот массив.
Теперь детали:
- На машине 128 Мб памяти (и нет свопа).
- Файл большой - в ОЗУ точно не поместится
- На диске есть место для временных файлов
- Операционная система - скорее всего какой-то *nix.
- Диск SSD, не HDD
- Машина скорее всего 64битная, но может быть и 32битной
- Машина двуядерная
Теперь следствия нюансов:
Решение может быть реализовано под наиболее вероятную конфигурацию машины (64 bit'ный *nix). Но возможность писать кроссплатформенно также ценится, поэтому будет две номинации:
- Самое быстрое решение
- Самое быстрое кроссплатформенное решение
В данном случае кроссплатформенность означает, что программа должна собираться и работать как минимум под *nix и windows (в крайнем случае - под linux и windows).
Теперь про сборку: должна быть возможность собирать программу автоматически, то есть из bash/bat-скрипта либо через makefile. Если программа кроссплатформенная, то она должна под обоими платформами собираться без правки исходников руками, то есть тоже просто запуском скрипта/make. Естественно при этом на систему можно руками поставить весь, необходимый для сборки, дополнительный софт.
При тестировании программа будет запущена пять раз, первые два запуска в зачет не идут. Время трех последнийх запусков усредняется.
ЭтапыПоскольку задача сложнее обычных тестов, и не очевидно какой алгоритм тут будет самый лучший, и какое решение самое замечательное (т.е. задача требует исследований и тестов), проходить всё будет в три этапа (на каждом этапе свои победители):
- Первый этап - на этом этапе каждый делает на своем любимом ЯП как может и как хочет. Любые алгоритмы, любые реализации, любые идеи. По итогам первого этапа выбираем самый быстрый алгоритм/идею.
- Второй этап - реализуем на разных ЯП (ну или разными руками на том же ЯП - без разницы) тот алгоритм и идею, что победила на первом этапе. Тут не обязательно соответствие буква к букве, просто берем за основу идею победителя и пытаемся её реализовать самостоятельно. По итогам этого этапа выбираем самую быструю реализацию реализацию идеи.
- Третий этап - берем самую быструю реализацию из второго этапа и пытаемся её воспроизвести на своем ЯП дословно, т.е. максимально близко к оригиналу. В идеале - буква к букве, настолько, насколько это возможно
Задача не проста, поэтому я не ожидаю что будет много решений, но надеюсь хотя бы на 2-3 участников. Для тестирования я выделю отдельную машину и буду там прогонять все решения раз или два раза в неделю (полный прогон тестов длится долго) в автоматическом режиме.
PS. У меня пока есть кривенькое решение на C++. Максимум что я еще смогу самостоятельно реализовать - ocaml и go. При этом за OCaml я не поручусь.
PPS. Правила проведения тестов вероятно будут дополняться.
UPD: Исходники решений слать и смотреть можно тут:
https://github.com/valexey/bigbenchПравила засылки исходники такие:
Делаем бранч репозитория
Создаем папку со своим username or nickname, в ней подкаталог с названием решения (вдруг у будет несколько вариантов и захочется протестить их все), а в нём, кроме исходников, либо makefile либо build.sh чтобы собрать решение можно было в автоматическом режиме.
Затем засылаем пулреквестом в этот репозиторий:
https://github.com/valexey/bigbenchМожно еще ридмишку в свой каталог положить - что в системе нужно иметь, чтобы собралось.
UPD 2: Текущие результаты (картинка обновляется при каждом прогоне тестов):