В аналогичной ситуации я сам кодировал простой код профилирования. В основном я использовал ThreadLocal, в котором есть «StopWatch» (основанный на LinkedHashMap), и затем я вставляю такой код в различные точки приложения: watch.time("OperationX");
затем, после того как поток завершит задачу, я вызову watch.logTime();
, и класс напишет журнал, который выглядит следующим образом: [DEBUG] StopWatch time:Stuff=0, AnotherEvent=102, OperationX=150
После этого я написал простой парсер, который генерирует CSV из этого журнала (для пути кода). Лучшее, что вы можете сделать, - это создать гистограмму (это легко сделать с помощью Excel). Средние, средние и даже режимы могут вас обмануть .. Я настоятельно рекомендую создать гистограмму.
Вместе с этой гистограммой вы можете создавать линейные графики, используя среднее / среднее / режим (который когда-либо представляет данные лучше всего, вы можете определить это по гистограмме).
Таким образом, вы можете быть на 100% уверены, какая именно операция занимает время. Если вы не можете определить виновника, бинарный поиск - ваш друг (детализируйте события).
Звучит действительно примитивно, но работает. Также, если вы сделаете из нее библиотеку, вы можете использовать ее в любом проекте. Это также круто, потому что вы можете легко включить его в производство ..