我讨论了这个问题DropWizard Metrics Meters vs Timer,并理解了定时器的概念。但是,有没有一种方法可以记录每次调用代码块时代码块的执行时间?我不想要这个计时器的平均速率和内容,因为这个方法调用频率不高,但调用时需要相当长的时间。那么,有没有一种方法可以打印每个调用的执行时间?此外,我如何获得以下问题的答案
任何帮助都将不胜感激。
不知道有没有办法获取定时器上下文对象,但是我有另外一个想法。你说这个方法不经常被调用。为什么不使用DynamicFeature并打印容器的执行时间?
下面我将向您展示如何实现这一点。我不确定这是否有效,我只是在没有任何测试的情况下对其进行了编码,因此请尝试一下,并在需要时进行更改。如果由于已实现的接口,执行时间筛选器需要拆分为两个单独的类,请相应地进行更改。
第1步:创建过滤器
@Provider
public class ExecutionTimeFilter implements ContainerRequestFilter, ContainerResponseFilter {
public static final String EXECUTION_TIME_HEADER = "X-Execution-Time";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.getHeaders().add(EXECUTION_TIME_HEADER, ZonedDateTime.now().toString());
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
ZonedDateTime executionStartHeader = ZonedDateTime.parse(requestContext.getHeaderString(EXECUTION_TIME_HEADER));
Duration executionTime = Duration.between(executionStartHeader, ZonedDateTime.now());
//you can also print some url informations or whatever you need; check out the informations from both mehtod params
System.out.println("The execution time was:" + executionTime);
}
}
步骤 2:创建动态功能
@Provider
public class ExecutionTimeFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
if (resourceInfo.getResourceMethod().getAnnotation(ExecutionTime.class) != null) {
context.register(ExecutionTimeFilter.class);
}
}
}
第3步:创建注释
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecutionTime {
}
步骤4:注释您的资源
@GET
@ExecutionTime
public String getExcpensiveCalculation(@QueryParam("number") @DefaultValue("1") IntegerParam number) {
return getCalculation(number);
}
步骤 5:注册功能
environment.jersey().register(ExecutionTimeFeature.class);
参考:带有过滤器的Dropwizard动态功能
为了报告准确的代码块执行时间,可以使用计数器。
它可以保持累积时间值,该值可以通过导数转换为图上的尖峰。以石墨的导数(..)函数为例(注意,这不是“真”导数,只是值差)。
这种方法不适合频繁的事件,不太容易扩展。在高负载的情况下,计时器更适合。
简单的java助手:
timed(String metricName, Runnable body) {
Counter counter = metricsRegistry.counter(metricName);
long t = System.currentTimeMillis();
try {
body.run();
finally {
counter.inc(System.currentTimeMillis() - t);
}
}
问题内容: 我想测量在Python程序中评估一块代码所花费的时间,可能在用户cpu时间,系统cpu时间和经过时间之间进行区分。 我知道该模块,但是我有许多自写函数,在设置过程中传递它们并不是很容易。 我宁愿有一些可以使用的东西: 用户和系统的CPU时间不是必需的(尽管我想测量它们),但是对于过去的时间,我希望能够执行类似的操作,而不是使用复杂的命令或模块。 问题答案: 要获取以秒为单位的经过时间,
本文向大家介绍Flutter倒计时/计时器的实现代码,包括了Flutter倒计时/计时器的实现代码的使用技巧和注意事项,需要的朋友参考一下 在我们实现某些功能时,可能会有倒计时的需求。 比如发送短信验证码,发送成功后可能要求用户一段时间内不能再次发送,这时候我们就需要进行倒计时,时间到了才允许再次操作。 如下图: 为了实现这样场景的需求,我们需要使用 Timer.periodic 。 一、引入Ti
本文向大家介绍Python代码执行时间测量模块timeit用法解析,包括了Python代码执行时间测量模块timeit用法解析的使用技巧和注意事项,需要的朋友参考一下 1.timeit模块 timeit模块可以用来测试一小段python代码的执行速度 class timeit.Timer(stmt = 'pass',setup = 'pass',timer=<timer function>) Ti
在没有任何Java RMI经验的情况下,我有一个天真的问题,但在搜索互联网后仍然不确定答案。 问题: 对我来说,有两种情况: 场景1:从本地启动一个Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法的类将下载到本地机器上,并继续执行。 场景2:从本地启动Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法将在远程机器上执行,结果将发送回本地机器。(
我正在学习DropWizard Metrics库(以前的Coda Hale指标),我不知道什么时候应该使用vs。根据文档: 仪表:仪表测量一组事件发生的速率 以及: 计时器:计时器基本上是一种事件持续时间的直方图和它发生的速率的度量 基于这些定义,我无法区分它们之间的区别。让我困惑的是,计时器的使用方式与我预期的不同。对我来说,计时器就是:计时器;它应该测量开始和停止之间的时间差。但计时器似乎也能
问题内容: 您将如何回答以下问题? Java类的方法包含必须自动执行的代码块。使用适当的伪代码说明如何确保自动执行此代码块 我可以通过制作方法来实现吗.. 然后确保返回get语句: 如果我想增加x的值,我会这样做吗? 问题答案: 答案取决于您对“原子”的定义 我知道以下三个有效定义: 与同步中的原子相同:一次只能有一个线程执行代码; 像ACID中那样是原子的:所有动作/阻止都发生,或没有动作; 原