关于Java 获取时间戳的方法

 更新时间:2022年04月19日 16:36:15   作者:程序员的成长之路  
这篇文章主要介绍了关于Java获取时间戳的方法,Java有两个取时间戳的方法,分别是System.currentTimeMillis()和System.nanoTime()下文对两种方法进行详细介绍,需要的小伙伴可以参考一下

Java有两个取时间戳的方法:System.currentTimeMillis()System.nanoTime(),它们的使用场景是有区别的,当前网上一些文章对于这两个方法的性能讨论存在一些片面的描述,本文希望能给出一个简单的最终答案。

System.currentTimeMillis() 存在性能问题?

答案是否定的。

这两个方法性能差异取决于操作系统。

Windows:

在 Windows 下,System.currentTimeMillis() System.nanoTime() 要快很多,这是因为 Windows 系统为前者提供的只是一个缓存变量,而后者则是实时的去硬件底层获取计数。

所以如果你的生产环境是 Windows,请尽可能避免使用 System.nanoTime()。

Linux:

在 Linux 下,两者的执行耗时相差不大,不论是单线程还是多线程。

不同的虚拟机实现会带来性能差异

如今的云主机主要有 Xen 和 KVM 两种实现方式,网上有文章发现它们在取系统时间方面存在性能差异。

当我们的虚拟机用的是 Xen 时,取时间的耗时会是 KVM 的十倍以上。不过上文也提供了遇到此类问题该如何解决的方案。

需要写一个专门的类来提升 System.currentTimeMillis() 性能吗?

不需要。那属于画蛇添足。

我的测试代码

我的测试代码如下,没有任何依赖,可以直接用 javac 编译然后运行。读者有兴趣可以试试。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;


public class TimePerformance {


public static final int LOOP_COUNT = 9999999;
public static final int THREAD_COUNT = 30;


public static void main(String[] args) {


Runnable millisTest = () -> {


long start = System.currentTimeMillis();
for (int i = 0; i < LOOP_COUNT; i++) {
System.currentTimeMillis();
}
long end = System.currentTimeMillis();


System.out.printf("%s : %f ns per call\n",
Thread.currentThread().getName(), ((double)end - start) * 1000000 / LOOP_COUNT);
};


Runnable nanoTest = () -> {


long start = System.currentTimeMillis();
for (int i = 0; i < LOOP_COUNT; i++) {
System.nanoTime();
}
long end = System.currentTimeMillis();


System.out.printf("%s : %f ns per call\n",
Thread.currentThread().getName(), ((double)end - start) * 1000000 / LOOP_COUNT);
};


Consumer<Runnable> testing = test -> {
System.out.println("Single thread test:");
test.run();


System.out.println(THREAD_COUNT + " threads test:");
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < THREAD_COUNT; i++) {
Thread t = new Thread(test);
t.start();
threads.add(t);
}
// Wait for all threads to finish
threads.forEach(thread -> {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
};


System.out.println(" Test System.nanoTime()");
testing.accept(nanoTest);
System.out.println(" Test System.currentTimeMillis()");
testing.accept(millisTest);
}
}

因为我用的是 Windows,所以执行输出当中System.nanoTime() 明显非常慢。具体输出内容我就不放出来了,因为不具有参考价值,大多数生产环境用的是 Linux。

到此这篇关于关于Java 获取时间戳的方法的文章就介绍到这了,更多相关Java 获取时间戳内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA解决springboot热部署失效问题(推荐)

    IDEA解决springboot热部署失效问题(推荐)

    热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。这篇文章主要介绍了IDEA解决springboot热部署失效问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析

    JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析

    这篇文章主要介绍了JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析及简单处理方法,文中给大家介绍了javaweb中dbutils的使用,需要的朋友可以参考下
    2017-12-12
  • Spring Boot整合Thymeleaf详解

    Spring Boot整合Thymeleaf详解

    这篇文章主要介绍了Spring Boot整合Thymeleaf详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 分享java中设置代理的两种方式

    分享java中设置代理的两种方式

    有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http、https、ftp、socks代理。比如在IE浏览器设置代理,这里简单介绍下,需要的朋友可以参考下
    2015-12-12
  • HashMap方法之Map.getOrDefault()解读及案例

    HashMap方法之Map.getOrDefault()解读及案例

    这篇文章主要介绍了HashMap方法之Map.getOrDefault()解读及案例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 关于Java使用Http轻量级请求库Unirest的方法

    关于Java使用Http轻量级请求库Unirest的方法

    这篇文章主要介绍了关于Java使用Http轻量级请求库Unirest的方法,Unirest 是一个轻量级的 HTTP 请求库,可发起 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 请求,支持 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多种语言,需要的朋友可以参考下
    2023-08-08
  • 使用maven方式创建springboot项目的方式

    使用maven方式创建springboot项目的方式

    使用Spring Initializr创建spring boot项目,因为外网问题导致很难成功,所以只能使用maven方式,这里介绍下使用maven方式创建springboot项目的方法,感兴趣的朋友一起看看吧
    2022-09-09
  • Java 替换字符串中的回车换行符的方法

    Java 替换字符串中的回车换行符的方法

    Java 替换字符串中的回车换行符的方法,需要的朋友可以参考一下
    2013-03-03
  • JAVA内存空间相关知识汇总

    JAVA内存空间相关知识汇总

    这篇文章主要介绍了JAVA内存空间相关知识,文中介绍的非常详细,代码帮助大家更好的参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • java搭建一个Socket服务器响应多用户访问

    java搭建一个Socket服务器响应多用户访问

    本篇文章主要介绍了java搭建一个Socket服务器响应多用户访问,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论