Блог пользователя cerealguy

Автор cerealguy, 12 лет назад, По-русски

Очень много задач впихивал на Java, но на следующий спецэффект почему-то до сих пор не обращал внимания.

  1. Пишем код, использующий где-нибудь маленькую библиотечную функцию вроде Math.max
  2. Запускаем и получаем TL
  3. Копипастим эту функцию из библиотеки в свой файл и вызываем скопипасченную функцию
  4. Ускорение в несколько раз

Почему-то работает на 32-битных JVM, не проявляется на 64-битных.

Следующий код в запуске Codeforces выдал 876 125 под Java 6 и 687 125 под Java 7.

WTF?

  • Проголосовать: нравится
  • +51
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится +5 Проголосовать: не нравится

Тоже в копилку: запускаем java у себя на ПК с параметром -server, получаем 210 175. Что то мне подсказывает, что 64-битная java по умолчанию запускается с ключом -server, что и понятно. Однако неизвестно, из за чего такой разброс между версиями JVM server и desktop.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

    Я вижу следующее объяснение.
    Inlining для методов внутри одного класса, видимо, работает как и в client-mode, так и в server-mode. Но в server-mode также осуществляется какой-то "aggressive inlining". Видимо эта оптимизация умеет подставлять куски кода методов (виртуальных тоже) из произвольных классов. На CodeForces как Java 6, так и Java 7 запускаются в client-mode (что, в частности, подтверждается этим постом). Следовательно большинство глобальных оптимизаций, которые доступны только в server-mode, не работают, в частности aggressive inlining. Вот цитата отсюда, подтверждающая мои слова:

    The Server VM contains an advanced adaptive compiler that supports many of the same types of optimizations performed by optimizing C++ compilers, as well as some optimizations that cannot be done by traditional compilers, such as aggressive inlining across virtual method invocations. This is a competitive and performance advantage over static compilers. Adaptive optimization technology is very flexible in its approach, and typically outperforms even advanced static analysis and compilation techniques.

»
12 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

Поведение JIT не более предсказуемое, чем всяких gcc/msvc. Я как-то натолкнулся на баг, когда добавление в программу строки вида "if (blahblah) while (true);" замедляло её на 5 секунд (blahblah — что-то очень простое, вида "n > 0"). А если добавить 2 таких строки подряд — то на 10 секунд. На фоне таких спецэффектов отсуствие инлайна функции из библиотеки выглядит не так уж страшно :)