您好我是java的新手,我正在尝试学习如何使用Dropwizard指标库来衡量单个流程的效果。我已经看过他们的入门并运行他们为MetricsRegistry编写的内容,但不了解如何将流程和metricsRegistry合并为一个(它衡量我的流程所需的时间而不是它需要自己运行的时间。)
我可能会写很多错误,但希望我的问题很清楚。在此先感谢我的任何帮助/澄清!我用下面的代码粘贴了我想要测量的代码(pi数字到第n个数字),Dropwizard Metrics为他们的入门提供了这些代码:
package decimals;
import java.util.Scanner;
import java.math.BigDecimal;
public class Decimals {
public static void main(String[] args) {
BigDecimal seven = new BigDecimal(7.0);
Scanner input = new Scanner(System.in);
System.out.println("to what nth?");
int i = input.nextInt();
BigDecimal pi = new BigDecimal(22.0).divide(seven, i, BigDecimal.ROUND_UP);
if ( i < 0) {
System.out.println("can't be less than 0");
} else {
System.out.println(pi);
}
}
}
//dropwizardmetrics:
package com.***.***;
import com.codahale.metrics.*;
import java.util.concurrent.TimeUnit;
public class MetricsRegistry {
static final MetricRegistry metrics = new MetricRegistry();
public static void main(String args[]) {
startReport();
Meter requests = metrics.meter("requests");
requests.mark();
wait5Seconds();
}
private static void startReport() {
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(2, TimeUnit.SECONDS);
}
private static void wait5Seconds() {
try {
Thread.sleep(5*1000);
}
catch(InterruptedException e) {}
}
}
答案 0 :(得分:0)
将所有Pi计算逻辑放入名为computePi()的方法中,并在main方法中尝试:
public static void main(String args[]) {
startReport();
Timer timer = metricRegistry.timer("computePi");
Timer.Context context = timer.time();
try {
computePi();
} finally {
context.stop();
}
}
在您的示例中,您使用的是Meter,它不会测量执行所需的时间(它会测量发生率和总计数)。我改变它是一个计时器,它也测量时间。当我调用timer.time()时,计时器开始。然后我在try块中执行你的computePi()过程。我用了#34;终于&#34;无论在computePi()内部发生什么,都阻止停止计时器。这就是您获得执行流程所需的确切时间的方法。