Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трата ресурсов на отслеживание операций 
:(
    Опции темы
Prospekt
Дата 12.11.2014, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 30.5.2012

Репутация: нет
Всего: 1



Вобщем тестю 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++.

Это сообщение отредактировал(а) Prospekt - 12.11.2014, 12:54
PM MAIL   Вверх
LSD
Дата 12.11.2014, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 1
Всего: 537



Benchmarking: You're Doing It Wrong.

Для начала рекомендую посмотреть Java Benchmarking: как два таймстампа записать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Prospekt
Дата 12.11.2014, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 30.5.2012

Репутация: нет
Всего: 1



Посмотрел. Не скажу, что много полезного узнал.

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

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

Единственное хочется узнать в каких случаях она производится, как на это повлиять, и где стоит её ожидать (а где наобьорот не стоит).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Design, Quality, Testing | Следующая тема »


 




[ Время генерации скрипта: 0.1097 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.