?

Log in

No account? Create an account

elizarov


Блог Романа Елизарова


Previous Entry Share Next Entry
Смотрим на ассемблерный код Java приложения в современном HotSpot-е
elizarov

Я уже писал об универсальном способе просмотра ассемблерного кода Java приложения, что бывает очень полезно при оптимизации производительности. К счастью, в современных версиях HotSpot JVM есть встроенная возможность вывода ассемблерного кода -XX:+PrintAssembly, которая включена даже в production сборку. То есть, можно скачать JDK прямо с сайта и... всё почти заработает, за исключением того, что собственно библиотека дизассемблирования в поставку JDK не входит.

Официальные источники предлагают собрать библиотеку из исходников самим, либо загрузить base-hdis с проекта Kenai, где выложены бинарники под unix-овые операционные системы. К счастью, есть добрая душа, которая выложила hsdis-i386.dll для 32-bit Windows систем здесь, для тех, кому нужно посмотреть на ассемблерный код на типичной desktop машине среднестатистического пользователя.

Собственно, доставание бинарника с дизассемблером и есть самая сложная часть. Дальше, положив его туда, откуда грузит библиотеки ваша JVM, всё становиться очень просто. Я использую вот такую комбинацию ключей при старте JVM:

-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*<classname>.<methodname> -XX:PrintAssemblyOptions=intel

Где в качестве <classname> и <methodname> указываю имя класса и метода, соответственно, ассемблерный код которого меня интересует в настоящий момент. На x86 архитектуре особо приятно иметь возможность видеть вывод в формате принятым Intel-ом.


  • 1
Если над целыми числами делать неочевидные вычисления, то можно наверняка найти примеры и с бОльшим приростом от SSE. Я лишь говорил про мой примитивный пример, когда тупо запуск в 4 потока позволяет насытить память.

Я про один поток говорил. Дело в том, что, если делать сложения в один поток, то даже в этом случае не получишь выигрыша. Если целые уже легли в кеш - то выигрыш в два раза.

Конечно. Если, например, стоит задача работать с матрицами, то их разбивают на блоки так, чтобы каждый влезал в кэш. Тогда SSE будет давать существенный выигрыш в производительности.

именно. поэтому, нужно аккуратно это формулировать :-) SIMD ускоряет, но не все так просто.

именно. поэтому, нужно аккуратно это формулировать :-) SIMD ускоряет, но не все так просто.

  • 1