2009-06-03 4 views
1

мне интересно, если есть какое-либо различие в производительности междуJava Оптимизация

  1. указателем на строке = someObject.toString(); System.out.println (ы);

    и

  2. System.out.println (someObject.toString());

Глядя на сгенерированный байт-код, он, кажется, имеет отличия. Способна ли JVM оптимизировать этот байт-код во время выполнения, чтобы оба решения обеспечивали одинаковые характеристики?

В этом простом случае, конечно, решение 2 кажется более подходящим, но иногда я бы предпочел решение 1 для целей удобочитаемости, и я просто хочу быть уверенным, что не будет производиться «снижение» в критических разделах кода.

ответ

6

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

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

Даже если байт-код выглядит по-другому, это потому, что javac наивна, и ваш JIT-компилятор делает тяжелый подъем для вас.Если этот код действительно имеет значение для скорости, он будет выполняться много, много раз, и ваш JIT выберет его для компиляции на собственный код. Весьма вероятно, что оба они скомпилируются в один и тот же собственный код.

И, наконец, почему вы вызываете System.out.println() в критическом по производительности коде? Если что-то здесь собирается убить вашу производительность, это будет.

+0

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

1

По сравнению с выходом на консоль, я сомневаюсь, что любой разница в производительности между двумя будет измеримой. Не оптимизируйте, прежде чем вы измерили и подтвердите, что у вас есть проблема.

2

Если у вас есть разделы критического кода, требующие производительности, не используйте System.out.println(). Потребуется больше накладных расходов, перейдя к стандартному выпуску, чем когда-либо будет с переменным присваиванием.

ли решение 1.

Edit: или раствор 2

2

Там нет * кода достаточно, чтобы разница между вашими двумя образцами делает никакой разницы вообще критично. Я призываю вас проверить это; запустить несколько миллионов раз и записать время.

Выберите более читаемую и обслуживаемую форму.

* Преувеличение эффекта. Если у вас достаточно критический код, вы изучили его, чтобы узнать об этом.

2

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

В случае сомнений используйте профилировщик.

+0

+1 для «использования профилировщика» –

Смежные вопросы