Комментарии 28
Но джава же не смотря на все свои jit'ы ужасающе медленная.
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust-java.html
А если не будут выжирать? Я столько раз видел программы на интерпретируемых языках, которые думали, что CPU не нужен, а он оказался нужен.
Там в бенчмарках не только числодробилки, но и регулярки.
Вы реализацию вначале изучите. На числодробилках в ржавом *явно* используются интринсики, а джава (пока) так не умеет, поэтому такое различие в производительности.
Дальше, посмотрите на каком говне мамонта тестят JIT для последней джавы (или не смотрите, скажу здесь: *core2duo*). Может на современном проце JIT бы автоматом добавил интринсики, но это не точно. По крайне-мере JIT должны оптимизировать под серверные ЦПУ. Поэтому не очень умно запускать современный JIT на core2duo…
Что касается регулярок, оно и nodejs сильно проигрывает, видимо хреновая реализация в OpenJDK.
По binary-tree, там тестирование уровня школоты. Знаю, так как сам смотрел. Если в ржавом или си заранее выделяют память под дерево, то джава выделяет и освобождает свой хип несколько раз, по мере роста дерева. А всё потому, что не заданы стартовые аргументы по хипу, а по дефолту они игрушечные.
Если задать нормальный хип, то джава на уровне си и ржавого по этому тесту. Проверял на своём ноуте.
И так во всём. Поэтому не обижайтесь, когда вас ниже причисляют к школоте. Все там были, я когда-то тоже ссылался на эти тесты, но теперь так не делаю.
А вы уверены, что в этом бенчмарке jit успел заработать? Если да, то какой из двух?
По мне, более показателен этот бенчмарк, ибо задачи там более приближены к реальности (работа с БД, сериализация). И java там обычно в топе.
Вот школота даже не может выбрать сравнение по теме статьи на сайте!
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/javascript.html
Это вы про себя?
Я показал, что java (и нода заодно) отчаянно проигрывают нормальным языкам программирования. Переход npm на rust, кстати, хороший пример. Don't eat own dogfood.
Вы можете использовать потоки, если они вам нужны. В node есть worker_threads нативные потоки, которые могут взаимодействовать между общим буфером.
napajs потоки от microsoft, которые работают на уровне системных, написаны на плюсах.
JDK проприетарен, поэтому Java развивается медленно.
Во-первых, JDK не проприетарна, она под Sun License (она считается открытой), и частично под GPL.
Во-вторых, java развивалась медленно не потому, что проприетарна, а потому что обратная совместимость. Чтобы внедрить новую штуку, не похерив обратную совместимость, нужно всё нормально спланировать, и учесть мнение многих людей, причастных к развитию платформы.
В-третьих, теперь java перешла на полугодовой релизный цикл, так что ваша информация как-то устарела.
Статья полна сравнениями тёплого с мягким, сферическими бенчмарками в вакуме и просто дилентантскими утверждениями.
Лень перечислять всё, для примера "один из минусов Node.JS":
был случай, когда разработчик удалил свою библиотеку из NPM и множество приложений использующих ее перестали работать;
1) NPM и Node.JS это разные вещи. Как можно делать вывод о платформе на основании менеджера пакетов?
2) Вот уже много лет с этого случая как в NPM запрещено удаление пакетов.
3) Есть альтернативы NPM и в виде менеджера пакетов и в виде хранилища.
4) Есть решения в виде локальных кеширующих NPM серверов.
5) Самое главное — приложения не "перестали работать". Удаление библиотеки никак не повлияло на работу приложений. А вот собираться они перестали.
О качестве остальной статьи делайте выводы сами.
1) Скорость обработки сетевых запросов
В Java мы можем создать приложение и запустить в нем 8 потоков. За счет того, что происходит более тесное взаимодействие с ОС, можно распределить нагрузку.
и в ноде тоже можно точно так же только называются такие потоки воркерами
А когда приходит запрос на node, цикл событий (event loop) будет обработан и отправлен обратно, затем придет следующий запрос. И за счет того, что мы не ждем результатов первого, он тоже будет подхвачен.
и в java можно делать то же самое (nio, nio2 и т.д)
Многие не понимают что модель работы с сетевыми (и другими io-) запросами зависит не от языка и даже не от движка а от того какой апи операционной системы проброшен в язык — можно обрабатывать сетевые запросы создавая поток на каждый запрос а можно через мультиплексирующие или асинхронные апи ос (например poll/select/epoll/signals в линуксе) — и на этом сравнение становится совершенно бессмысленным потому что в джаве что в ноде можно пробросить любой апи операционной системы и соотвественно эффективность обработки запросов тут целиком зависит от ос и никак не от языка или движка (если конечно не накосячить с пробросом). А то что в ноде принято запросы обрабатывать через цикл событий а в джаве через потоки (а например в php еще можно через процессы) то это просто потому что джава появилась раньше
2) Скорость вычислений. Тут говорить что мол джава хороша для вычислений, сложных алгоритмов или бизнес-логики, а нода менее хороша (или наоборот) — бессмысленно и это очевидно каждому кто понимает как работает jit и процессоры. Современные движки что в js (в частности v8 который стоит в ноде) что в java уже довольно давно стали компилировать код в машинные инструкции с различными компиляторными оптимизациями поэтому разница по производительности будет минимальной. Понятно что может быть так что у одного движка может не реализована какая-то одна оптимизация а у другого другая но если не писать микробенчмарков направленных на выявления конкретных оптимизаций то можно сказать что общий уровень производительности обоих языков и движков примерно одинаков. А тот факт что джава статически типизируемый язык а жс нет — хотя и может сэкономить движку джавы одну ассемблерную инструкцию (которая требуется v8 для спекулятивной проверки рантайм-типа) но практическую разницу в скорости вы даже не увидите так как в реальных приложениях практически всегда всплывут сначала проблемы неоптимальной локальности данных (для сравнения один кеш-промах или инструкция загрузки из памяти а не из кеша равен нескольким сотням других ассеблерных инструкций, так что разницу в одну ассеблерную инструкцию вы даже не увидите)
Сейчас не видно потенциального конкурента, который смог бы заменить Java и node.js
Так их вроде много, смотря какие задачи. На вскидку из современных платформ и языков сразу на ум приходят .net core, go, rust, python, да php в конце-концов. Если подумать подольше то конкурентов много больше. Еще есть функциональные языки со своими экосистемами, на которых люди решают любые задачи.
Не согласен с автором, что придет NodeJS и всех зарулит. Тут наоборот, дело к закату идет,
для написания сервисов с высокой нагрузкой и малым временем отклика, предпологаю, чаще стали брать GoLang. Тут сказывается то, что сам JavaScript все-таки плохо подходит для больших приложений и то, что не было многопоточности. Не от хорошей жизни хотят
в NodeJS начать использовать TypeScript.
Подъем NodeJS произошел на двух вещах:
1) В эпоху взрывного роста Ajax и возрастающего объема программирования на JavaScript на клиенте можно было начать писать на JavaScript и на сервере.
2) Легкость организации асинхронного выполнения программы, этакой многопоточности с точки зрения программиста.
А Java по-прежнему "пыхтит" на предприятиях и даже ускорила свое развитее после перехода к быстрым релизам, сохранив и LTS-релизы.
Например, такой условный недостаток как однопоточность уже исправленЗабавно, что одно из самых главных преимуществ автор обозвал недостатком.
Java изначально создавалась как легковесное решение заменяющее C++— Java.
— Легковесное.
Выбрать одно.
Вообще забавная статья. Прям как комикс, где стоят слон, обезьяна и т.д. и экспериментатор говорит «мы вас поставили в равные условия в этом тесте… поэтому вам нужно залезть на дерево». Так и тут автор почему-то сравнивает node.js и java на задаче связанной с большими вычислениями/обработкой данных. Нода не про это.
1) OpenJDK opensource, и Oracle JDK на 95% это OpenJDK.
2) Как раз с Java все и потырили парадигмы, как например C#. Java эволюционирует и не стоит на месте.
3) На счет тяжеловестности тоже бред, можно легко создавать через Spring Boot легковесные сервлеты. Для исполнения в NodeJS тоже нужен движок V8, как и для Java JRE (который не так и много весит)
4) В Java также можно обрабатывать запросы на основе цикла событий. Также через потоки паралелить. Как вообще их можно сравнивать. Также акторы реактивщина есть.
5) на счет дерева зависимостей в NPM смешно читать. В java уже давно существует мега стабильный maven и более молодой и перспективный gradle.
6) Ваши ощущения, что NodeJS обогнала Java, это лишь ваше субъективное ощущение, которое никак не связано с реальностью, есть статистика на HR ресурсах, со спросом на конкретных специалистов.
Node.js или Java: производительность, ресурсы, управление потоками, популярность и личный опыт