![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Mirkes |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
День добрый.
Модифицировал свою программу, приводя к более читаемому и легче модифицируемому виду и столкнулся с потрясающим эффектом торможения. Вот фрагмент кода старой версии метода:
В качестве основной структуры данных использованы double[][] inputs и поле answers в объекте ans. Поскольку такой разброс данных по разным структурам не удобен, я создал в абстрактном классе, являющемся прототипом того, в котором реализованы оба метода, старый и новый, внутренний класс Record:
После чего написал новый расчетный метод на основе новой структуры данных:
Легко заметить, что новый метод получен прямым копированием с последующим приведением циклов и обращений к данным к новой структуре. Можно также заметить, что в методах стоит отсчет времени. Вот результаты:
Невооруженным глазом видно, что новый метод работает почти в 8 раз медленнее старого. Собственно вопрос. Такое торможение это нормальное явление или я где-то круто наколбасил? Например класс Record нужно было делать отдельным, а не вложенным? Поля класса нужно было делать package protected или public? Поля класса Record нужно было объявлять final? Может еще какие идеи есть? Заранее спасибо! -------------------- Mirkes |
||||||||
|
|||||||||
| Mirkes |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Еще точнее локализовал место торможения:
Старый метод
Новый метод
наружу выводится полное время в методе и суммарное время в данном фрагменте. плюс я потом посчитал время в остальной части метода и среднее время в остальной части метода: New version 37,318,277,450 34,478,510,827 2,839,766,623 New version 36,169,007,371 33,488,532,797 2,680,474,574 2,735,056,488 New version 36,031,285,164 33,346,356,897 2,684,928,267 Old version 5,366,280,548 2,860,017,089 2,506,263,459 Old version 5,300,923,214 2,822,633,646 2,478,289,568 2,489,431,553 Old version 4,015,113,629 1,531,371,997 2,483,741,632 -------------------- Mirkes |
||||
|
|||||
| Mirkes |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Начал с тупого поиска причин и на первой же итерации получил вместо торможения некоторое (недостоверное) ускорение. Вот новый текст нового метода (фрагмент)
Легко заметить, что отличие от старого варианта только в организации цикла. Результаты для сравнения старый результат New version 37,318,277,450 34,478,510,827 New version 36,169,007,371 33,488,532,797 New version 36,031,285,164 33,346,356,897 новый результат New version 5,099,199,203 2,589,693,051 New version 5,064,083,085 2,582,950,691 New version 4,030,317,983 1,539,601,223 Обращаюсь к документации
Действительно, данная конструкция делает код понятнее, но потери в производительности в 7 раз - это круто. Везде в других местах в Гугле пишут что конструкции приблизительно одинаковы, но for each более читаемая. Еще и рекомендуют использовать эту форму везде, где только можно! Интересно, это мне так везет, или никто просто не пытался использовать этот цикл в счетных частях? Это сообщение отредактировал(а) Mirkes - 18.10.2013, 13:12 -------------------- Mirkes |
||||||
|
|||||||
| Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Провел тест вне прочего контекста
Методы фактически такие же, но никакой статистически достоверной разницы в скорости выполнения не наблюдается. Такое впечатление, что смена типа цикла приводит в случае основной программы к каким-то дополнительным расходам. Понять бы еще каким. Займусь профайлером. Тему закрываю, скорее всего ее следует удалить, поскольку сухой остаток такой: Однако если пустить в IDE но без отладчика или с отладчиком но с профайлером - тогда все нормально. IDE JDeveloper. При каких условиях - не знаю и искать не буду. Сожалею о Вашем времени, потраченном на чтение всего этого -------------------- Mirkes |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |