关于Java 获取时间戳的方法

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 获取时间戳内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java获取精确到秒的时间戳方法

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1.时间戳简介: 时间戳的定义:通常是一个字符序列,唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数(引用自百度百科) 2.Java中的时间戳: 在不同的开发语言中,获取到的时间戳的长度是不同的,例如C++中的时间戳是精确到秒的,但是Java中的时间戳是精确到毫秒的,这

  • java中如何获取时间戳的方法实例

    前言 数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数(引用自百度百科) 在java开发过程中经常会遇到统计某一天或是某一个月的数据,因此常常需要获取截取数据的两个时间戳(比如统计今天的数据,则需要获取一个开始时间为今天零点以及一个结束时间为明天零点),然后根据数据相关的时间是否在该时间区间内来判断是否将其计入统计数据中. 一.java获取时间戳 话不多说,首先我们先拿上面的例

  • Java获取凌晨时间戳的方法分析

    本文实例讲述了Java获取凌晨时间戳的方法.分享给大家供大家参考,具体如下: 这两天有一个需求是查询用户匹配的推荐信息,包含一个有效时间段,以天为单位,0时0分0秒这种. 通常java中有两种方案: 第一种:使用Calendar.这种比较简单,也最常见.代码如下: package dateTimeDemo; import java.util.Calendar; public class timeDemo { public static void main(String[] args) { //

  • 关于Java 获取时间戳的方法

    Java有两个取时间戳的方法:System.currentTimeMillis() 和System.nanoTime(),它们的使用场景是有区别的,当前网上一些文章对于这两个方法的性能讨论存在一些片面的描述,本文希望能给出一个简单的最终答案. System.currentTimeMillis() 存在性能问题? 答案是否定的. 这两个方法性能差异取决于操作系统. Windows: 在 Windows 下,System.currentTimeMillis() 比System.nanoTime()

  • Java获取代码中方法参数名信息的方法

    前言 大家都知道随着java8的使用,在相应的方法签名中增加了新的对象Parameter,用于表示特定的参数信息,通过它的getName可以获取相应的参数名.即像在代码中编写的,如命名为username,那么在前台进行传参时,即不需要再编写如@Parameter("username")类的注解,而直接就能进行按名映射. 如下的代码参考所示: public class T { private interface T2 { void method(String username, Stri

  • Java获取当前时间方法总结

    最简单获取当前时间的方法: 方法一: import java.util.Calendar; public class DateTime{ public static void main(String[] args){ Calendar c = Calendar.getInstance(); System.out.println("当前时间为:"); System.out.println(c.get(Calendar.YEAR)+"年"+(c.get(Calendar

  • java获取类名的方法详解

    如果我们要获取当前运行的类名,怎么来获取? 在Class类中,有如下一个方法: 比如现在有一个类Demo7.java package pxx.test1; public class Demo7 { public static void main(String[] args) { Demo7 demo7 = new Demo7(); System.out.println(demo7.getClass().getName()); } } 运行结果: 上面就是直接这个对象调用了getClass()得到

  • java获取日期的方法

    复制代码 代码如下: /** 获取昨天日期 方法一,这个方法好像有点慢*/Date dt = new Date(); Calendar cal = Calendar.getInstance();cal.add(Calendar.DATE, -1);time = new SimpleDateFormat( "yyyy-MM-dd").format(cal.getTime()); /** 获取昨天日期 方法二*/Date as = new Date(new Date().getTime()

  • java获取时间的方法总结

    一.获取当前时间,   格式为:   yyyy-mm-dd   hh-mm-ss DateFormat.getDateTimeInstance(2, 2, Locale.CHINESE).format(new java.util.Date()); 二.获取当前时间,   格式为:   yyyy年mm月dd日   上午/下午hh时mm分ss秒DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG,   Locale.CHINE

  • Java获取工程路径方法详解

    第一种: File f = new File(this.getClass().getResource("/").getPath());  System.out.println(f); 结果: C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin 获取当前类的所在工程路径: 如果不加"/": File f = new File(this.getClass().getResource(

  • Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System.currentTimeMillis() System类中的currentTimeMillis()方法是三种方式中效率最好的,运行时间最短.开发中如果设计到效率问题,推荐使用此种方式获取. System.currentTimeMillis() 2.new Date().getTime() 除了Sys

  • java获取整点与凌晨的时间戳

    Java中获取整点时间戳 在实际的开发过程中,前端给后端传时间的时候,有时候传的是整点数值,比如:timeList=[00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24],这样传值给后端获取时间带了了一定的麻烦,首先我们需要把每一个整点转换成时间戳,在做有关时间的操作,具体做法如下: Calendar cal = Calendar.getInstance(); cal.set(Calendar.HO

随机推荐