相关疑难解决方法(0)

Java中的CPU执行时间

我想计算我的函数在Java中执行需要多少CPU时间.目前我正在做如下.

   long startTime = System.currentTimeMillis();
    myfunction();
    long endTime = System.currentTimeMillis();
    long searchTime = endTime - startTime;
Run Code Online (Sandbox Code Playgroud)

但我发现,对于相同的I/PI,根据系统负载获得不同的时间.

那么,如何获得我的函数执行所需的精确CPU时间.

java time execution

10
推荐指数
2
解决办法
2万
查看次数

处理时间措施的最佳方法是什么?

我的目标是编写一个框架,用于测量方法执行或事务时间以及处理测量,即存储,分析等.事务可能包括调用外部系统,同步或异步等待结果.

关于这个话题已经存在一些问题,比如

所有的答案归结为三种方法来花时间

  • System.currentTimeMillis()
  • System.nanoTime()
  • Instant.now()Duration(自Java 8以来)

我知道,所有这些都有一些影响

System.currentTimeMillis的()

该方法的结果取决于平台.在Linux上你获得1ms的分辨率,在Windows中你得到10ms(单核)~15ms(多核).因此,可以测量大型运行操作或短期运行操作的多次执行.

System.nanoTime()

你得到一个高分辨率的时间测量,具有纳秒精度(但不一定是纳秒精度),并且在292年之后你会得到溢出(我可以忍受它).

Instant.now()和持续时间

从Java 8开始,就有了新的时间API.瞬间有第二个和第二个纳米字段,因此它在对象引用的顶部使用两个长值(相同Duration).您还可以获得纳秒精度,具体取决于基础时钟(请参阅" 具有纳秒分辨率的Java 8 Instant.now()? ").实例化是通过调用Instant.now()哪些映射到System.currentTimeMillis()正常的系统时钟来完成的.

鉴于事实,很明显,最佳精确度只能通过实现System.nanoTime(),但我的问题更多地针对处理一般措施的最佳做法,这不仅包括采取措施,还包括措施处理.

  • Instant和Duration提供最佳API支持(计算,比较等),但在标准情况下具有os-dependend精度,内存和创建度量的更多开销(对象构造,更深的callstack)

  • System.nanoTime()和System.currentTimeMillis()具有不同的精度级别,但只有基本的"api"支持(数学操作为long),但更快和更小以保持在内存中.

那么最好的方法是什么?有没有我没想过的含义?还有其他选择吗?

java performance time timing java-8

9
推荐指数
1
解决办法
1924
查看次数

计算Spring Job的执行时间

我有一个非常基本的Spring Job示例。

@Scheduled(fixedRate = 90000)
    public void myScheduler() throws Exception {

        // Print here execution time into console and save into DB
    }
Run Code Online (Sandbox Code Playgroud)

我必须做一些非常繁重的计算。有没有一种方法可以计算总执行时间?侦听器有一个解决方案,但是我想在作业内部执行此操作,因为我想在Job实施代码中执行此操作。

java spring spring-boot

9
推荐指数
2
解决办法
577
查看次数

了解基本的Java特定的interverview问题

最后一天,我接受了一次采访,他们问我java问题,其中一些问题我不知道答案.我很想知道这个问题的答案.采访者没有告诉我答案.我在这里问这个问题:

  • Java是否提供任何构造来查找对象的大小?
  • 提供一种最简单的方法来查找方法执行所需的时间而不使用任何分析工具?
  • 什么是检查异常和运行时异常?
  • 如果我在try块结束时写return,finally块是否仍会执行?
  • 如果我写System.exit(0); 在try块的末尾,finally块是否仍会执行?

想知道上述问题的答案,以便下次可以帮助我.

只需简单的答案,我们就会非常感谢对规范的说明,注释和/或相关链接 - 以及学习这些东西的好方法是什么?

java

7
推荐指数
1
解决办法
1450
查看次数

libGDX - 围绕图像创建边框

我可以在图像周围制作边框吗?我在2D中有很多块,当玩家用鼠标悬停在其中一个上时,我想显示纹理/图像周围的边框.

多数民众赞成我实际上是如何绘制块的(我认为它不相关,但也许它会有所帮助):

batch.draw(map.map[mapPos].TEXTURE, (mapPosX * Block.WIDTH), (mapPosY * Block.HEIGHT), Block.WIDTH, Block.HEIGHT);
Run Code Online (Sandbox Code Playgroud)

是否可以使用代码或者我应该使用纹理和边框围绕它创建单独的图像?有任何想法吗?

java textures libgdx

7
推荐指数
1
解决办法
4514
查看次数

String,StringBuffer和StringBuilder之间的性能和简单性权衡

你有没有想过这种变化对Java编程语言的影响?

String类被设想为一个不可变类(并且这个决定是故意考虑的).但字符串连接真的很慢,我自己对它进行了基准测试.所以StringBuffer诞生了.非常好的课程,同步和非常快.但有些人对某些同步块的性能成本不满意,并引入了StringBuilder.

但是,当使用String来连接不太多的对象时,类的不变性使其成为实现线程安全的一种非常自然的方式.当我们想要管理多个字符串时,我可以理解StringBuffer的使用.但是,这是我的第一个问题:

  1. 例如,如果您想要追加10个或更少的字符串,那么您是否会在执行时间内将简单性换成几毫秒?

    我也对StringBuilder进行了基准测试.它比StringBuffer更有效(仅提高10%).但是,如果在您的单线程程序中使用StringBuilder,如果您有时想要将设计更改为使用多个线程,会发生什么?你必须改变StringBuilder的每个实例,如果你忘记了一个,你将会产生一些奇怪的效果(考虑到可能出现的竞争条件).

  2. 在这种情况下,您会在几小时的调试中交换性能吗?

好的,就是这样.除了简单的问题(StringBuffer比"+"和线程安全更有效,而StringBuilder比StringBuffer更快但没有线程安全)我想知道何时使用它们.

(重要:我知道它们之间的差异;这是与平台架构和一些设计决策相关的问题.)

java architecture string

6
推荐指数
3
解决办法
7643
查看次数

如何在android中测试执行时序的功能?

我被困在我的一个功能需要一些时间来执行的地方.我使用对象模型和ArrayList(s)在对象中有一个对象层次结构.我只想知道调试代码的技术,以检查代码的哪个语句在执行时花费时间.

testing performance android performance-testing execution-time

5
推荐指数
2
解决办法
7871
查看次数

NoSuchMethodError:com.google.common.base.Platform.systemNanoTime()在GWT项目中

我在gwt项目中得到一个例外,我正在使用它 systemNanoTime()

... threw an unexpected exception: java.lang.NoSuchMethodError: com.google.common.base.Platform.systemNanoTime()J
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579)
    ........
Run Code Online (Sandbox Code Playgroud)

我正在使用番石榴-18.Java构建路径中的jar.

java gwt google-app-engine guava

5
推荐指数
1
解决办法
5191
查看次数

在Java中计时代码执行的一种干净方法是什么?

时间代码执行可能很方便,所以您知道事情要花多长时间。但是,我发现这样做的一般方法很草率,因为它应该具有相同的缩进,这使得读取实际计时内容变得更加困难。

long start = System.nanoTime();

// The code you want to time

long end = System.nanoTime();
System.out.printf("That took: %d ms.%n", TimeUnit.NANOSECONDS.toMillis(end - start));
Run Code Online (Sandbox Code Playgroud)

尝试

我提出以下内容,它看起来更好,但有一些优点和缺点:

好处:

  • 很明显,由于缩进,正在计时
  • 它会自动打印代码完成后花费多长时间

缺点:

  • 这不是AutoClosable应该使用的方式(很确定)
  • 它创建了一个TimeCode不好的新实例
  • try块内声明的变量不能在块外访问

可以这样使用:

 try (TimeCode t = new TimeCode()) {
     // The stuff you want to time
 }
Run Code Online (Sandbox Code Playgroud)

使之成为可能的代码是:

class TimeCode implements AutoCloseable {

    private long startTime;

    public TimeCode() {
        this.startTime = System.nanoTime();
    }

    @Override
    public void close() throws Exception {
        long endTime = …
Run Code Online (Sandbox Code Playgroud)

java timing autocloseable

5
推荐指数
1
解决办法
449
查看次数

为什么在Java中对方法进行计时时会使用finally块?

/sf/answers/12613401/

这里通过调用System.nanoTime()普通块来定时方法,而在finally块中调用结束时间?

这是否只是为了报告正确的时间,即使方法抛出异常?或者确实保证更多:不仅会被调用,而且还会在方法之后(即防止任务切换或类似......)?

final在这里使用修饰符的动机是什么?

java timing

3
推荐指数
1
解决办法
222
查看次数