На носу было придумывание темы для диплома, на кафедре популярностью пользовались различные варианты идей связанных с генетическими алгоритмами, а мне самому хотелось сделать что-нибудь этакое. Так и родилась идея, давшая начало данному проекту, а именно генетическому оптимизатору программного кода. ![][1] Цель была довольно амбициозной — в идеале сделать такую штуку, которой на вход подается программа, а дальше она ее крутит так и сяк и пытается всячески ускорить отдельные ее фрагменты без участия человека, попутно собирая себе базу для последующих оптимизаций. Сразу скажу что хотя в целом задача была решена, практической пользы я из нее извлечь не смог. Однако некоторые полученные в процессе результаты показались мне достаточно интересными чтобы ими поделиться. Например вот такая забавная оптимизация набора арифметических инструкций (взятых из какой-то подвернувшейся под руку математической библиотеки), соответствующих формулам: [![][2]][3], которая на 6 джаве с выключенным JIT у меня давала около 10% ускорения, при этом на первый взгляд даже не очевидно что эти формулы эквивалентны (ОТКУДА ТУТ OR? ЭТО ВООБЩЕ ЗАКОННО?!), хотя это так. Под катом я расскажу, как именно получались такие результаты и каким образом компьютер придумывал лучший код чем тот, который мог написать я сам. [Читать дальше →][4]
[1]:
https://habrastorage.org/files/644/992/0ba/6449920ba4474c458b1b1525baf26c32.GIF
[2]:
https://latex.codecogs.com/gif.latex?\inline&space;x^3+x^2+x&space;\rightarrow&space;((x&space;+&space;1)x&space;\vee&space;1)x "x^3+x^2+x \rightarrow ((x + 1)x \vee 1)x"
[3]:
https://www.codecogs.com/eqnedit.php?latex=\inline&space;x^3+x^2+x&space;\rightarrow&space;((x&space;+&space;1)x&space;\vee&space;1)x
[4]:
http://habrahabr.ru/post/265195/#habracut