Какая операция на JVM самая дорогая? - PullRequest
2 голосов
/ 01 февраля 2011

Я помню, как мой профессор сказал, что операция new - самая дорогая операция на JVMЭто правда?Я имею в виду, дороже, чем открыть файл?И как я могу узнать стоимость любой операции на Java?Например, найти разницу между

int a;
Integer b;
Integer c = new Integer(1);
int[] d = new int[10];
Integer[] e = new Integer[10];

Ответы [ 8 ]

8 голосов
/ 01 февраля 2011

Это очень зависит от реализации.Скорее всего, на современной JVM ни один из них не имеет никаких затрат.При своевременной компиляции некоторые JVM обнаружат, что ваши объекты не выходят за рамки вашей функции, и выделят их «бесплатно» в стеке.

Вы не можете измерить большинстводорогая операция на JVM.Если известно, что что-то дорогое, возможно, так или иначе, кто-то в Sun Oracle работает над тем, чтобы сделать это менее дорогим, и следующее, что вы знаете, это будет постоянное время.

Единственноевещь, которая считается дорогой в любом программировании, должна быть вашими алгоритмами.

6 голосов
/ 01 февраля 2011

Не могу сказать, что самое дорогое, но я уверен, что это не новый (конечно, ваш конструктор может быть тяжелым, если он много чего делает):

Общий путь к коду для новой функции Object () в HotSpot 1.4.2 и более поздних версиях составляет примерно 10 машинных инструкций (данные предоставлены Sun; см. Раздел Ресурсы), тогда как для наиболее эффективных реализаций malloc в C требуется в среднем от 60 и 100 инструкций за вызов (Detlefs, et. al .; см. Ресурсы). И производительность выделения не является тривиальным компонентом общей производительности - тесты показывают, что многие реальные программы на C и C ++, такие как Perl и Ghostscript, тратят от 20 до 30 процентов своего общего времени выполнения в malloc и бесплатно - гораздо больше, чем затраты на распределение и сборку мусора в работоспособном Java-приложении

Взятый из этой статьи, обратите внимание, что в ней говорится о JVM 1.4.2 (статья была опубликована в 2005 году). Вот еще один из 2003 года, рассказывающий о некоторых мифах о производительности Java, которые все еще циркулируют. И более новые JVM должны быть значительно быстрее, чем версии тех дней.

2 голосов
/ 01 февраля 2011

Сколько стоит операция на JVM?

Это, вероятно, не значимая или не поддающаяся количественной оценке вещь:

  • Вы еще не сказали, что такое "операция".
  • В зависимости от того, что вы подразумеваете под «операцией», «стоимость», скорее всего, зависит от контекста. Например, while (i < 999) i++;, вероятно, будет иметь нулевую стоимость после оптимизации JIT-компилятором.

Я помню, что мой профессор сказал, что операция new () является самой дорогой операцией на JVM. Это правда?

Вероятно, нет.

Я имею в виду, чем открыть файл?

Конечно, нет. Процесс открытия файла создаст несколько объектов.

Но если вы называете открытие файла «операцией», насколько маленькой или большой может быть операция?

а как узнать стоимость любой операции в Java?

Очень сложно написать эталонный тест, который изолирует и измеряет стоимость данной операции. И это вообще бессмысленно, потому что JVM оптимизирует последовательности операций.

Например, разница между ...

Даже ваш пример трудно измерить. Например:

  • Часть стоимости этих утверждений должна быть амортизирована с затратами на сборщик мусора.

  • JIT-компилятор может решить, что некоторые или все эти операторы не влияют на результат вычисления, и полностью их оптимизировать.

1 голос
/ 01 февраля 2011

Открытие файла будет операцией ОС, а не JVM.При работе ваш инструктор должен иметь в виду инструкции Java-байт-кода .new () является дорогостоящим, поскольку требует, чтобы JVM выделяла память и вызывала цепную реакцию для инициализации иерархии объектов.Он также может оказывать долгосрочное влияние на ГХ и т. Д. См. Настройка производительности Java .

1 голос
/ 01 февраля 2011

Почти наверняка ложь. Особенно, если вы говорите о сравнении его с такими вещами, как «открытие файла» (что, безусловно, больше, чем одна операция JVM), это далеко не самое дорогое, что вы можете сделать.

Если вы говорите о чистом настенном времени, такие вещи, как сокет read(), можно измерить с точностью до секунд. Если вы хотите что-то интенсивное с точки зрения проделанной работы, вы можете отобразить нативный ByteByffer , и это займет галактический возраст по сравнению с new()

1 голос
/ 01 февраля 2011

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

Некоторые из более «дорогих» операций - это, конечно, файловый / сокетный ввод-вывод и synchronize ().

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

0 голосов
/ 01 февраля 2011

дорого по сравнению с чем?А какая для вас «валюта» стоимости?Часто JVM амортизирует затраты на профилирование и оптимизацию фрагмента кода по многим вызовам, поэтому ситуация может оказаться даже более сложной, чем вы думаете.вещей 10000 раз и измерьте время и память, чтобы почувствовать относительную стоимость вещей.

0 голосов
/ 01 февраля 2011

Самой дорогостоящей операцией тогда будет

while(true){}

, но чтобы получить общее представление о расходах, вы должны использовать профилировщик или эталонный тест.Но будьте осторожны, микробенчмарки в Java часто приводят к ложным результатам, потому что JVM очень и очень хорошо оптимизирует код и удаляет ненужные операторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...