论坛首页 入门技术论坛

Java中的System.nano()很慢

浏览 2266 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-02   最后修改:2010-12-02
System.nano()调用耗时450 nano,超级慢,比new Object()的操作慢100倍。比System.currentMillis()慢20多倍。

经一群无聊好事者查证,System.nanoTime()在linux下的实现,最终调用clock_gettime系统函数。

100万次调用耗时,java语言中System.nanoTime()和C语言中的clock_gettime()调用时间基本一致,所以System.nanoTime()慢的原因就是系统调用clock_gettime。

无聊好事者请注意,自行测试System.nanoTime()性能时,要这样写:
for (int i = 0; i < 1000 * 1000; ++i) {
	long v = System.nanoTime();
}

而不能这样写:
for (int i = 0; i < 1000 * 1000; ++i) {
	System.nanoTime();
}
   发表时间:2010-12-03  
请问这两种写法有何本质的区别吗?
mac os 10.6
两种写法耗时几乎相同
0 请登录后投票
   发表时间:2010-12-03  
Zahir 写道
请问这两种写法有何本质的区别吗?
mac os 10.6
两种写法耗时几乎相同

加上 java -server xxxxxx 再试
0 请登录后投票
   发表时间:2010-12-03  
在WinXP 32bit JVM下-client两种写法耗时是不一样,在linux 64bit JVM下,耗时是一样的。
0 请登录后投票
   发表时间:2010-12-22   最后修改:2010-12-22
WindowXP 32bit
public class NanoTimeTest {
    public static void main(String [] args) {
        test1();
        test2();
    }

    static void test1() {
        long time = System.currentTimeMillis();
        for(int i=0; i < 1000 * 1000; ++i) {
            System.nanoTime();
        }
        System.out.println("test1:" + (System.currentTimeMillis() - time));
    }

    static void test2() {
        long time = System.currentTimeMillis();
        for(int i=0; i < 1000 * 1000; ++i) {
            long v = System.nanoTime();
        }
        System.out.println("test2:" + (System.currentTimeMillis() - time));
    }
}


F:\Java2>java -server NanoTimeTest
test1:500
test2:500

F:\Java2>java -client NanoTimeTest
test1:16
test2:484
0 请登录后投票
   发表时间:2010-12-22  
可能会有一点影响,不过这个值几乎可以忽略,在性能比较的时候。

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics