Привет.
У меня тут случайно код на хаскеле получился быстрее аналогичного кода на C++. Иногда — на 40%.
(время работы, меньше — лучше, C++ снизу)
Что самое смешное — я собирал хаскель-код через LLVM-бекенд, но при этом сравнивал с GCC. Если сравнивать с clang (что вроде как логичнее), то всё становится ещё хуже для плюсов: почему-то на этой задаче clang проигрывает GCC в пару раз, и разница становится не 40%, а этак раза три. Впрочем, одна маленькая модификация C++-кода это поменяет.
Началось всё с того, что для одного моего проекта (который, естественно, делается на хаскеле, и о котором я тоже скоро напишу) нужно было быстро и эффективно считать расстояние Левенштейна между двумя строками. Расстояние Левенштейна — это такая метрика, которая говорит, сколько символов нужно удалить, добавить или заменить в одной строке, чтобы она стала равна другой строке. Я считал расстояния между довольно большими строками (масштаба десятков тысяч символов), поэтому эффективность была действительно важна.
А потом мне стало интересно, насколько быстро я вообще могу это расстояние считать (потратив разумное время на оптимизацию, конечно), так что я набросал вариант на С++ и взял его время работы за этакий идеал, к которому стоит стремиться. Впрочем, как уже понятно, идеал оказался превзойдён.
Посмотрим, как этого можно достичь?
В качестве бонуса — сравнение с некоторыми другими языками. Спойлеры:
- Nim медленнее компилятора C двадцатилетней давности.
- C# в пять раз медленнее Java, которая оказывается вполне на уровне Rust.
- Go вровень с C.
- PHP быстрее питона (что оправдывает вторую часть заголовка).