| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| Посмотрел. Не скажу, что много полезного узнал. Тем не мение, понятно, что самым быстрым будет инлайновый код, это когда тело метода вставляется в код, и этим экономится затраты на сам выхов функции(пересылка значений в аргументы, работа со стеком и так далее). Не говоря уже о том, что зная зарание тело метода можно его "срастить" (оптимизировать) с учетом рядом стоящий инструкций. Судя по экспериментам, ламбда выражения по эффективности почти достигают инлайнового варианта, который по логике является пределом. Никак иначе, кроме как ИНЛАЙНИТЬ тело метода, приблизиться к этому пределу не получится. Значит динамическая оптимизация производится (перестройка кода в рантайме). Единственное хочется узнать в каких случаях она производится, как на это повлиять, и где стоит её ожидать (а где наобьорот не стоит). |