Подтвердить что ты не робот

Почему байт-код может работать быстрее, чем собственный код

Java медленная.

Это больше, чем "городская легенда", похоже, это факт. Вы не используете его для живого кодирования из-за латентности, и вы не используете его для кластеров/параллельных вычислений. Существуют тысячи эталонных тестов, особенно "Java vs С# vs С++".

http://benchmarksgame.alioth.debian.org/

В соответствии с вышеприведенным сайтом не только производительность Java почти такая же, как и C (далека от остальной), но Scala и Clojure (оба функциональных языка, которые работают на JVM) имеют лучшую производительность, OCaml, Erlang.

И есть много "Java быстрее, чем X", а также (например, вопрос здесь о SO: Java Runtime Performance Vs Native C/С++ Code?).

Итак, Java в некоторых случаях кажется быстрым. Может кто-нибудь объяснить, почему?

Почему байт-код может работать быстрее, чем собственный код, в некоторых случаях заданный динамический код (Scala, Clojure) и сбор мусора? Почему, если это быстрее, все еще есть латентность?

Кажется, здесь есть противоречие, может ли кто-то пролить свет?

4b9b3361

Ответ 1

В книге, вдохновляющей программирование, Джеймс Гослинг объяснил:

Джеймс: Точно. В эти дни избивая действительно хорошие C и С++ компиляторы почти всегда. Когда ты перейдите в динамический компилятор, вы получите два преимущества, когда компиляторы бегущая прямо в последний момент. Один вы точно знаете, какой набор микросхем вы бежите дальше. Так много раз, когда люди компилируют кусок C кода, они должны скомпилировать его для запуска по виду общего x86 архитектура. Почти ни одна из бинарные файлы, которые вы получаете, особенно хороши настроенный для любого из них. Вы загружаете последняя копия Mozilla, и itll работает практически во всех Intel архитектура CPU. В значительной степени один Linux файл. Его довольно общий, и его скомпилированный с помощью GCC, который не очень хороший компилятор C.

Когда HotSpot работает, он точно знает какой чипсет вы работаете. Это точно знает, как работает кеш. Это точно знает, как иерархия памяти работает. Он точно знает, как все межблочные блокировки работают в ЦП. Он знает, какой набор инструкций расширения этого чипа. Это оптимизирует для какой именно машины Вы на. Тогда другая половина заключается в том, что он фактически видит приложения в качестве его запуска. Его способность иметь статистику, которая все важно. Его способность встроенные вещи, которые компилятор C мог никогда не делай. То, что получает встроенный в мир Java довольно удивительно. Затем вы как управление хранилищем работает с современные сборщики мусора. С современный сборщик мусора, хранилище распределение происходит очень быстро.

Ответ 2

В быстрых JVM используется компиляция Just-In-Time (JIT). Байт-код переходит в нативный код "на лету" во время выполнения. JIT предоставляет множество возможностей для оптимизации. См. эту статью в Википедии для получения дополнительной информации о JIT.

Ответ 3

JVM приходят во многие вкусы!

Самые быстрые компилируют байтовый код в собственный код "на лету", основываясь на собранных характеристиках производительности. Все это требует дополнительной памяти, поэтому они покупают скорость за счет памяти. Кроме того, максимальная скорость занимает некоторое время, поэтому преимущество не отображается для краткосрочных программ.

Тем не менее, JamVM интерпретатор (который крошечный по сравнению с JVM Oracle) все еще достигает максимальной скорости разумной доли от скомпилированных JVM.

Что касается сбора мусора, скорость снова возникает из-за наличия большого количества доступной памяти. Также истинная выгода исходит из устранения ответственности за код, чтобы отслеживать, когда объект больше не используется. Это приводит к более простым и менее подверженным ошибкам программам.

Ответ 4

Байт-код Java намного проще оптимизировать, чем основной код операции. Поскольку байт-код ограничен, и вы не можете делать какие-то опасные вещи, вы можете оптимизировать его более полно. Например, нарисуйте указатель. http://en.wikipedia.org/wiki/Pointer_aliasing

В c/С++ вы можете сделать

char[] somebuffer = getABuffer();
char* ptr = &someBuffer[2];
memcpy(ptr, somebuffer, length);

это затрудняет оптимизацию в некоторых случаях, потому что вы не можете быть уверены в том, что относится к чему. В Java этого типа не допускается.

в общем случае мутации кода, которые вы можете выполнять на более высоком уровне абстракции, гораздо более мощны, чем могут быть в объектном коде.

Ответ 5

Хорошо, это старый аргумент. Почти все преобладают как Emacs и VI (но определенно не такие старые). Я видел, что многие разработчики С++ предоставляют множество аргументов о том, почему большинство тестов производительности (особенно упоминание о том, как java работает так же быстро, как С++ __), искажено, и, честно говоря, у них есть точка.

У меня недостаточно знаний или времени, чтобы глубже понять, как Java может быть таким же быстрым, как С++, но вот почему это может быть...

1- Когда вы попросите двух очень способных разработчиков написать код на Java и С++ для реальной проблемы (такой же проблемы), я бы удивился, если java работает быстрее, чем С++. С++, когда хорошо написано, использует часть памяти, которую Java будет использовать. (Объекты Java немного раздуты).

2- Java по своей сути означает более простой язык, и он был написан, чтобы убедиться, что субоптимальный код трудно записать. Отвлекая управление памятью, а также обрабатывая оптимизацию низкого уровня, легко написать хороший код на Java, чем на С++. (это, по-моему, самое главное... Его сложно написать плохой код в Java). С другой стороны хороший разработчик на С++ мог справиться с управлением памятью намного лучше, чем автоматический GC в java. (Java хранит все в куче, поэтому использует больше памяти...)

3- Компилятор Java был улучшен последовательно, и идеи, подобные "горячей точке", оказались лучше маркетингового. (когда JIT был представлен, это был просто маркетинговый термин.. по мне..:))

4- Эргономика или настройка параметров, основанных на базовых параметрах операционной системы, улучшают вариацию дескриптора java. Таким образом, в некоторых средах его не очень сложно обрабатывать как Java, так и С++.

5. Открытие причины высокого уровня concurrency и parallelism api для разработчиков Java также является причиной. Пакет Java concurrency, возможно, самый простой способ написать высокопроизводительный код, который может использовать сегодня многопроцессорные среды.

6- Поскольку аппаратное обеспечение становится все более и более дешевым, компетенция разработчика стала более значительным фактором, и поэтому я считаю, что много кода С++ в дикой природе, вероятно, медленнее, чем Java.