diff --git a/changelog/@unreleased/pr-1686.v2.yml b/changelog/@unreleased/pr-1686.v2.yml new file mode 100644 index 000000000..fe12cc461 --- /dev/null +++ b/changelog/@unreleased/pr-1686.v2.yml @@ -0,0 +1,5 @@ +type: improvement +improvement: + description: Reduce executor allocation overhead from Timer.Context + links: + - https://github.com/palantir/tritium/pull/1686 diff --git a/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsExecutorService.java b/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsExecutorService.java index 3b2132193..732fad70d 100644 --- a/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsExecutorService.java +++ b/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsExecutorService.java @@ -136,9 +136,11 @@ private final class TaggedMetricsRunnable implements Runnable { public void run() { stopQueueTimer(); running.inc(); - try (Timer.Context ignored = duration.time()) { + long startNanos = System.nanoTime(); + try { task.run(); } finally { + duration.update(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); running.dec(); } } @@ -169,9 +171,11 @@ private final class TaggedMetricsCallable implements Callable { public T call() throws Exception { stopQueueTimer(); running.inc(); - try (Timer.Context ignored = duration.time()) { + long startNanos = System.nanoTime(); + try { return task.call(); } finally { + duration.update(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); running.dec(); } } diff --git a/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsScheduledExecutorService.java b/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsScheduledExecutorService.java index b87082fe6..5f500635c 100644 --- a/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsScheduledExecutorService.java +++ b/tritium-metrics/src/main/java/com/palantir/tritium/metrics/TaggedMetricsScheduledExecutorService.java @@ -132,9 +132,11 @@ private final class TaggedMetricsRunnable implements Runnable { @Override public void run() { running.inc(); - try (Timer.Context ignored = duration.time()) { + long startNanos = System.nanoTime(); + try { task.run(); } finally { + duration.update(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); running.dec(); } } @@ -153,11 +155,12 @@ private final class TaggedMetricsScheduledRunnable implements Runnable { @Override public void run() { running.inc(); - Timer.Context context = duration.time(); + long startNanos = System.nanoTime(); try { task.run(); } finally { - long elapsed = context.stop(); + long elapsed = System.nanoTime() - startNanos; + duration.update(elapsed, TimeUnit.NANOSECONDS); running.dec(); if (elapsed > periodInNanos) { scheduledOverrun.inc(); @@ -177,9 +180,11 @@ private final class TaggedMetricsCallable implements Callable { @Override public T call() throws Exception { running.inc(); - try (Timer.Context ignored = duration.time()) { + long startNanos = System.nanoTime(); + try { return task.call(); } finally { + duration.update(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); running.dec(); } }