07 декабря 2009

Только профайлеру известно, где оптимизировать код

Несколько дней назад я ковырялся в запутанном куске (чужого) Java кода, который перекладывает данные из одних структур в другие, сортирует, потом забывает о сортировке, складывая всё в HashSet, потом сортирует снова по тому же признаку, и всё такое прочее. Я знал, что этот код вызывается многократно и подозревал, что он далеко не оптимален.

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

Результат был потрясающ. Влияние этого куска кода на производительность было мизерное. А больше всего времени сервер проводил -- внимание! -- беря остаток от деления больших целых чисел в процедуре проверки валидности cookie и -- внимание ещё раз! -- собирая stack trace для того чтоб сделать INFO запись в логе (java.util.logging.Logger.info(), да).  Что одно, что другое с точки зрения серверного кода выглядело симпатичным вызовом одного метода, на который никто никогда в жизни не обратил бы никакого внимания.