I. Быстрая Java
Производительность в Java -- она не в каком-то конкрентном месте, это часть
культуры (анти-)качества Java. На Java можно (и нужно) писать быстрый и
качественный код, но часто не получается. Дело не в каких-то компонентах,
вроде бенчмарки говорят "у нас всё (почти) быстро", но тут потеряли немного
на неэффективном расположении данных в памяти, тут для простоты библиотеку
набросили, и так далее.
Вот, пример культуры:
http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.htmlНепонятно, как это работает, но мы переписали с Питона -- и вуаяля, прирост в
100 раз.
И наблюдается постепенная деградация, когда код скатыается в категорию "полный
энтерпрайз". И вот уже запуск тестового сервера требует 32Гб памяти, а то и
полный кубернетис. Сил не хватает, и в бой идут все. Десятки команд, полный
скрам и скрам скрамов, и все пишут, пишут код. Который, прямо скажем, не блещет
гениальностью. И таким образом, замыкает цикл Java.
Когда-то было не так. Был C, C++ и совсем ассемблер. И через отрицание C++
появилась Java. Язык выского уровня. Забыты все те устремления к идеальному
и выразительному, осталась только самая суть, объекты и их взаимоотношения.
И постепенно даже производительность подросла. И бенчмарки показывают, что
всё хорошо, быстро. Даже иногда быстрее, чем C++.
Но были те, кто говорили, что тормозит. В микро-, может, и нормально, но
макро- -- тормозит. И предлагали эксперимент, "а давайте перепишем на C++, и
сравним". И все смеялись над ними, дурачками, потому что ну нельзя же
действительно всерьёз обсуждать переписывание на C++, это в 21-то веке!
II. ...или всё-таки можно?
А почему всё-таки нельзя? Было время, когда на C++ было очень опасно
программировать. То ногу себе отстрелишь, то диск отформатируешь. Инструменты
никакущие, и все не очень совместимые. Нельзя большое приложение писать!
Потом вдруг оказалось, что можно-то и поменьше кусочки делать, и
производительность стала более конкретно в деньгах выражаться. И самое главное,
стали появляться языки, на которых и писать комфортно и проклятия Java нет.
И вот пошёл новый виток, отрицание отрицания. Частичный возврат к более
приземлённым языкам, например, Go. Или вот, например, Rust. С одной стороны --
вроде бы системный язык, всё такое низкоуровневое. Но если немного абстрагироваться
от особенностей синтаксиса и посмотреть на предлагаемые возможности, то открывается
интересная картина. Язык по выразительным возможностям очень даже ничего.
Единство противоположностей. С одной стороны, можно орудовать весьма абстрактными
понятиями (не Haskell, конечно, но всё равно), а с другой -- всегда под рукой
тяжёлая дубина попроще. Можно указателями вдарить, SIMD, макросами, или даже
просто условной компиляцией. Заимствования и подсчёт ссылок -- это, конечно,
не сборка мусора, но очень часто эргономика терпимая (меня уверяют, что даже
на C++ стало гораздо лучше жить, но я им не очень доверяю).
При этом, можно, например, что-нибудь такое навертеть:
http://www.vldb.org/pvldb/vol10/p1118-li.pdfЭто, конечно, странно, сначала сделать ужасный формат, а потом его героически
парсить, но правила пишем не мы.
III. Производительность или переход количества в качество
Почему же нужна производительность, если всё упирается в базу или сеть?
Конечно, дешевле же просто докупить железа для сервисов, они же у нас масштабируются?
Железо не обходится бесплатно, тут заплатили, тут команду нарастили поддерживать,
тут вероятность отказа выросла. И опять наблюдается переход количества в качество,
там, где можно было обойтись чем-нибудь попроще, работают кластеры, огромные
команды.
А если наоборот? Там, где была bulk обработка вдруг оказывается целесообразной
реалтайм обработка, там где нужен был кластер, можно обойтись одним узлом.
Я знаю компании, которых разорили счета с AWS. Можно невооруженным взглядом
наблюдать проблемы производительности, например, на мобильных устройствах.
Какой-то жалкий Apple Music тормозит так, как будто он биткойны майнит.