Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Design, Quality, Testing > Трата ресурсов на отслеживание операций


Автор: Prospekt 12.11.2014, 12:52
Вобщем тестю 8 java.
Сделал несколько функций, в которых в 2-м цикле производится суммирование из массива.
1) инлайновое суммрование (раскрыл операции)
2) суммирование вызывается через через метод этого-же сласса
3) суммирование производится через вызов static-метода другого класса
4) суммированием занимается переданный класс
5) суммирование идет через лямбда-выражение (оно в качестверагумента передается)

условно первые 3 варианта показали 450 мс, 4-620, 5-670. Т.е. лямбда имеет явную задержку.
Чтобы уменьшить влияние цикла на тест (каждая итерация = 1 суммироние счетчика + 1 условие), я внутри цикла поставил не одну операцию суммирования, а 10.

После этого результат стал следующим:
1 - 4500
2 - 4500
3 - 4500
4 - 4500
5 - 4550 до 4600 (2-3% по сравнению с другими)

Я это могу обяснить только тем, что JVM отслеживает часто исполняемые операции и каким-то макаром их раскрывает в inline.
Но с другой стороны на само отслеживание ведь тоже нужно тратить ресурсы. Почему же тогда динамическая компиляция (отслеживание и перестройка кода в рантайме) не замедляет работу программы? Во всяком случае на простых примерах код на Java почти догоняет C++.

Автор: LSD 12.11.2014, 13:37
Benchmarking: You're Doing It Wrong.

Для начала рекомендую посмотреть http://youtu.be/fzEUyqg3WPU.

Автор: Prospekt 12.11.2014, 20:21
Посмотрел. Не скажу, что много полезного узнал.

Тем не мение, понятно, что самым быстрым будет инлайновый код, это когда тело метода вставляется в код, и этим экономится затраты на сам выхов функции(пересылка значений в аргументы, работа со стеком и так далее). Не говоря уже о том, что зная зарание тело метода можно его "срастить" (оптимизировать) с учетом рядом стоящий инструкций.

Судя по экспериментам, ламбда выражения по эффективности почти достигают инлайнового варианта, который по логике является пределом. Никак иначе, кроме как ИНЛАЙНИТЬ тело метода, приблизиться к этому пределу не получится. Значит динамическая оптимизация производится (перестройка кода в рантайме).

Единственное хочется узнать в каких случаях она производится, как на это повлиять, и где стоит её ожидать (а где наобьорот не стоит).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)