今天我做了一个快速的Benchmark来测试速度性能System.nanoTime()和System.currentTimeMillis():
long startTime = System.nanoTime();
for(int i = 0; i < 1000000; i++) {
long test = System.nanoTime();
}
long endTime = System.nanoTime();
System.out.println("Total time: "+(endTime-startTime));
Run Code Online (Sandbox Code Playgroud)
这是结果:
System.currentTimeMillis(): average of 12.7836022 / function call
System.nanoTime(): average of 34.6395674 / function call
Run Code Online (Sandbox Code Playgroud)
为什么跑步速度的差异如此之大?
基准系统:
Java 1.7.0_25
Windows 8 64-bit
CPU: AMD FX-6100
Run Code Online (Sandbox Code Playgroud) 我正在从一个线程发送网络数据包,并在另一个运行在不同CPU核心上的线程上接收回复.我的进程测量每个数据包的发送和接收之间的时间(类似于ping).我正在使用rdtsc来获得高分辨率,低开销的时序,这是我的实现所需要的.
所有测量看起来都很可靠.尽管如此,我仍然担心核心的rdtsc准确性,因为我一直在阅读一些暗示tsc未在核心之间同步的文本.
恒定的TSC行为可确保每个时钟周期的持续时间均匀,并支持将TSC用作挂钟定时器,即使处理器内核更改频率也是如此.这是所有英特尔处理器的架构行为.
我仍然担心核心的累积性,这是我的问题
private Timestamp timestamp = new Timestamp(System.nanoTime());在创建对象时,我正在我的一个实体中执行操作.
如果我system.out时间戳,我得到的价值就像;
2282-08-24 11:25:00.506
2286-04-16 01:47:35.882
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
System.currentTimeMillis()给出正确的日期,但我需要更准确.这可能有什么问题?