Performance counters for Java

💡 Усі статті, обговорення, новини про Java — в одному місці. Приєднуйтесь до Java спільноти!

Всем привет,

висит на мне задаче мерять какие куски кода тормозят в системе на Java: нужно разработать Performance counters framework, который бы собирал статистику по выполнению разных кусков кода, и очень важно что бы механизм сбора статистики сам по себе не оказывал влияния на производительность. Уперся в вопрос как мерять время, простой подход:

long t1 = System.currentTimeMillis ();
...

long t2 = System.currentTimeMillis ();

totalTime += t2 — t1;

оказывает влияние на производительность (сам по себе забирает достаточно времени). Я еще не сильно нырял в этом направлении, но возможно кто-то подскажет какие нибудь эфективтные tricks.

Спасибо!

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

В том-то и дело, что про продакшен сервера и многопоточность автор ничего не сказал.

мв как-то использовали Jamon jamonapi.sourceforge.net (+ AOP-ом вставить счетчик в интересующих местах на время анализа) — вполне работает.

2леска, я мало видел людей готовых поставить на продакшен сервера профайлер, а тем более погнать клиентов работать с инструментированым сервером:) это скорее социальный эксперимент будет...

да и профилирование слабо помогает в многопоточных приложениях если много времени уходит на контексты и синхронизацию

А что мешает под профайлером погонять приложение? Ну и применение аспектно-ориентированного подхода напрашивается само собой.

зависит от того что мерять:) если вы замеряете по таймеру вычисление напряжения на конструкции ГЭС то врядли, а если будете мерять операцию присвоения — то конечно...
вопрос № 1 блоки с измерениями вложеные?

2 — неужели время выполнения интерисующего кода соизмеримо с временем вычисления таймера?

Эот все правильно, но когда вы включаете сбор статистики, то механизм сбора сильно влияет на саму статистику.

Мы делали перф. каутеры с возможностью выключения тогда и замеры можно сделать и на перф. системы влияния нету

К сожалению nanoTime () работает в раз 5 медленнее на моих тестах чем выше предложенный вариант...

2crypto5:
1. System.currentTimeMillis () забирає зовсім небагато часу, можеш з цим не перейматись. Зовсім без overhead-а не вийде ніяк — код що виконує заміри працює в тому самому thread-і, що і робочий код (а якщо в іншому — то час буде тратитися на комунікацію між thread-ами:).
2. Якщо код працює під керуванням якогось фреймворку по типу Spring IoC — варто накласти інтерцептор через AOP (див. www.javalobby.org/...s/t44746.html) Плюс тут буде в тому, що не потрібно змінювати код, що тестується, і можна легко відключити то в production-середовищі. Мінус — частини методу так не протестуєш, тільки ті методи, що викликаються через контейнер. Проте цього зазвичай вистачає.
3. Якщо так вже потрібно заміряти швидкодію частин методів — є такий милий клас: StopWatch.html.
4. А взагалі в таких випадках найкраще використати зовнішній профайлер. Мені найбільше подобається JProfiler. Він платний, але має тріалку.
2Александр Пометнёв:

Не використовуй wraper-типи в арифметичних операціях! Joshua Bloch не схвалює цього:)


Александр Пометнёв

Попробуй два куска кода:

	public static void main(String[] args) {
		long t1, t2;
		long tt1 = System.currentTimeMillis();
		long total = 0;
		for(long i = 0; i < 100000000; ) {
			t1 = System.currentTimeMillis();
			i += i % 10 + 1;
			t2 = System.currentTimeMillis();
			total += t2 - t1;
		}
		long tt2 = System.currentTimeMillis();
		System.out.println(tt2 - tt1);
	}

и

	public static void main(String[] args) {
		long t1, t2;
		long tt1 = System.currentTimeMillis();
		long total = 0;
		for(long i = 0; i < 100000000; ) {
			i += i % 10 + 1;
		}
		long tt2 = System.currentTimeMillis();
		System.out.println(tt2 - tt1);
	}

Думаю разница будет вполне заметна.
Вопрос в том как сократить издержки, например было бы класно найти пути вроде:  — получать миллисекунды без вызова функции — получать количество тиков проца (это положительно сказалось бы на точности измерений)  — найты более быструю функцию

и т.д.

see System.nanoTime () ,

но сначал доку почитай, там точность не в наносекундах, а соответстует точности самого точного таймена, доступного джаве на конкретной системе

Підписатись на коментарі