当前位置: 首页 > 面试题库 >

为什么使用System.nanoTime()获得消极的经过时间?

陶炫明
2023-03-14
问题内容

我正在尝试使用以下代码System.nanoTime()来测量代码的经过时间。

public static void main(String[] args) throws Exception {
    while (true) {
        long start = System.nanoTime();
        for (int i = 0; i < 10000; i++)
            ;
        long end = System.nanoTime();
        long cost = end - start;
        if (cost < 0) {
            System.out.println("start: " + start + ", end: " + end + ", cost: " + cost);
        }
    }
}

我得到这样的结果:

start: 34571588742886, end: 34571585695366, cost: -3047520
start: 34571590239323, end: 34571586847711, cost: -3391612
start: 34571651240343, end: 34571648928369, cost: -2311974
start: 34571684937094, end: 34571681543134, cost: -3393960
start: 34571791867954, end: 34571788878081, cost: -2989873
start: 34571838733068, end: 34571835464021, cost: -3269047
start: 34571869993665, end: 34571866950949, cost: -3042716
start: 34571963747021, end: 34571960656216, cost: -3090805
start: 34571965020545, end: 34571961637608, cost: -3382937
start: 34572010616580, end: 34572007613257, cost: -3003323

为什么我得到负值?

(作业系统:Windows XP SP3,Java:jdk1.6u27)


问题答案:

可以将nanoTime用作CPU时钟周期计数器。由于可以在略微不同的时间启动不同的CPU,因此不同的CPU上的时钟计数器也可以不同。Linux对此进行了纠正,但是Windows的较早版本没有。(我假设您有两个CPU,每个CPU的间隔为3
ms)

您还应该偶尔看到超过2.5毫秒的正跳。

尝试

if (cost < 0 || cost > 2000000) {

随着进程在CPU之间切换,您应该看到一些向前跳转和向后跳转。



 类似资料:
  • 当我阅读Java中的System.nanoTime()API时。我发现了这句台词: 一个应该使用t1-t0<0,而不是t1 Java整数compareTo()-为什么使用比较与减法? 这两件事产生矛盾。

  • 本文向大家介绍在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 相关面试题,主要包含被问及在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 时的应答技巧和注意事项,需要的朋友参考一下 纳米时间不是“实时”时间,它只是一个计数器,在发生某些未指定的事件(可能是计算机已启动)时,将从某个未指定的数字开始递增。

  • 问题内容: 今天,我做了一些快速基准测试来测试and的速度性能: 结果如下: 为什么运行速度差异如此之大? 基准系统: 问题答案: 从这个Oracle博客中: 使用GetSystemTimeAsFileTime方法实现该方法,该方法本质上只是读取Windows维护的低分辨率日期时间值。读取此全局变量自然非常快- 根据报告的信息,大约需要6个周期。 使用 (如果可用,则返回。)实现,具体取决于运行的

  • 我有一个简单的Spring MVC应用程序。我从报告中获得HTTP状态404。帮助我解决此问题。非常感谢。 HTTP状态404–未找到 类型状态报告 消息/WEB-INF/users\u视图。jsp 说明源服务器找不到目标资源的当前表示形式,或不愿意透露存在该表示形式。 Apache Tomcat/9.0.0. M26 我的控制器: 项目结构: 我的web.xml代码: 和应用程序上下文。xml:

  • 我写了一段代码,对给定的输入进行排序,但在返回排序后的输入后,它将始终返回相同的输出。我正在使用创建控制台应用程序。Visual Studio中的NET 5.0(当前版本)。 当我输入“Car-Apple-Banana”时,它会按单词排序。排序() 之后,我打印出原始输入,但它似乎也被排序。我不知道为什么,因为我从不分类。 当输入为:“汽车苹果香蕉” 我现在得到的输出是: 苹果香蕉车 苹果香蕉车

  • 本文向大家介绍为什么要使用 kafka,为什么要使用消息队列?相关面试题,主要包含被问及为什么要使用 kafka,为什么要使用消息队列?时的应答技巧和注意事项,需要的朋友参考一下 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的