Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.currentTimeMillis()vs.new Date()vs.Calendar.getInstance().getTime()_Java_Performance_Date_Time_Calendar - Fatal编程技术网

Java System.currentTimeMillis()vs.new Date()vs.Calendar.getInstance().getTime()

Java System.currentTimeMillis()vs.new Date()vs.Calendar.getInstance().getTime(),java,performance,date,time,calendar,Java,Performance,Date,Time,Calendar,在Java中,使用 System.currentTimeMillis() vs vs 据我所知,System.currentTimeMillis()是最有效的。但是,在大多数应用程序中,长值需要转换为日期或类似的对象,才能对人类执行任何有意义的操作。我更喜欢使用System.currentTimeMillis()返回的值用于所有类型的计算,如果我需要真正显示由人类读取的值,则仅使用日历或日期。这还可以防止99%的夏令时错误。:) 如果您使用的是日期,那么我强烈建议您使用jodatime。对日

在Java中,使用

System.currentTimeMillis() 
vs

vs


据我所知,
System.currentTimeMillis()
是最有效的。但是,在大多数应用程序中,长值需要转换为日期或类似的对象,才能对人类执行任何有意义的操作。

我更喜欢使用
System.currentTimeMillis()返回的值
用于所有类型的计算,如果我需要真正显示由人类读取的值,则仅使用
日历
日期
。这还可以防止99%的夏令时错误。:)

如果您使用的是日期,那么我强烈建议您使用jodatime。对日期字段使用
System.currentTimeMillis()
听起来是一个非常糟糕的主意,因为最终会产生大量无用的代码

日期和日历都严重受损,日历无疑是其中表现最差的

我建议您在实际使用毫秒操作时使用
System.currentTimeMillis()
,例如

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;

查看JDK,
Calendar.getInstance()
的最内层构造函数有:

public GregorianCalendar(TimeZone zone, Locale aLocale) {
    super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}
所以它已经自动执行了你的建议。Date的默认构造函数包含以下内容:

public Date() {
    this(System.currentTimeMillis());
}

因此,实际上不需要专门获取系统时间,除非您想在使用它创建日历/日期对象之前对它进行一些计算。此外,如果您的目的是大量使用日期计算,我建议您使用它来替代Java自己的日历/日期类。

System.currentTimeMillis()
显然是最有效的,因为它甚至不创建对象,而是创建新日期()实际上只是一个很薄的包装,大约有一个长的长度,所以它并不落后<另一方面,代码>日历相对较慢且非常复杂,因为它必须处理日期和时间(闰年、夏令时、时区等)固有的相当复杂和所有奇怪之处


通常,最好只处理应用程序中的长时间戳或
Date
对象,并且只在实际需要执行日期/时间计算时使用
Calendar
,或者格式化日期以便向用户显示。如果你必须做很多事情,使用它可能是一个好主意,对于更干净的接口和更好的性能。

取决于你的应用程序,你可能想考虑使用<代码> Stase.NeimTime[()/<代码>。< /P> < P>在我的机器上,我试过检查它。我的结果是:

Calendar.getInstance().getTime() (*1000000 times) = 402ms new Date().getTime(); (*1000000 times) = 18ms System.currentTimeMillis() (*1000000 times) = 16ms Calendar.getInstance().getTime()(*1000000次)=402ms 新日期().getTime();(*1000000次)=18ms System.currentTimeMillis()(*1000000次)=16ms 不要忘记GC(如果您使用
Calendar.getInstance()
new Date()

我尝试了以下方法:

        long now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            new Date().getTime();
        }
        long result = System.currentTimeMillis() - now;

        System.out.println("Date(): " + result);

        now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            System.currentTimeMillis();
        }
        result = System.currentTimeMillis() - now;

        System.out.println("currentTimeMillis(): " + result);
long now=System.currentTimeMillis();
对于(int i=0;i<10000000;i++){
新日期().getTime();
}
长结果=System.currentTimeMillis()-现在;
System.out.println(“日期():”+结果);
现在=System.currentTimeMillis();
对于(int i=0;i<10000000;i++){
System.currentTimeMillis();
}
结果=System.currentTimeMillis()-现在;
System.out.println(“currentTimeMillis():”+结果);
结果是:

日期():199


currentTimeMillis():3

系统。currentTimeMillis()
显然是最快的,因为它只需要一个方法调用,不需要垃圾收集器。

为什么,他的问题是关于资源和性能,nanoTime()使用了更多的资源我提到它,因为这是其他人都没有建议的选项。海报上没有指定平台。SDN bug 6876279表明,在某些JDK版本中,currentTimeMillis()和nanoTime()的值大致相同。海报也没有说明他们的准确度要求,因为原始列表可能不足以满足这些要求。虽然时间可能晚了,但问题中的所有示例都有一个绝对的概念,即自Unix时代开始以来的时间是多少,例如1348770313071毫秒。
nanoTime
返回的时间是相对的(通常与程序的开始时间有关),如果您试图将其转换为日期,则返回的时间将毫无意义。是的,但您可以在程序开始时将currentTimeilli和nano存储在一些静态代码中,然后使用这些作为偏移量,使用双var=currentTimeStart-nanoTimeStart+nanoTimeNow从milli获得精确的nano。如果许多线程在其他处理之间调用相同的函数,那么会不会有任何差异?这是一个微基准测试,您应该小心地相信您得到的结果。看看,这个基准测试没有什么意义,或者更好,它表明Java下的操作系统确实很重要。我在一个循环中运行了十几次相同的基准测试(将“now”和“result”的初始化移出循环),每次运行时我都有一些可爱的差异:Date():322到330;currentTimeMillis():319到322。在其他一些跑步中,我有日期():312到318;currentTimeMillis():324到335。因此,在实际案例中,它们是相当等价的(也要看数据的来源)。仅供参考,我在Ubuntu上使用了Java7。你的答案没有任何价值,因为它只是先前批准答案的子集。您应该尽量避免以这种方式回答,尤其是不要考虑到这是一个已经有了高质量答案的非常古老的问题。其次,Eden space中的短期对象不需要垃圾收集器。我想对此进行评论,因为您的示例正是您不应该使用System.currentTimeMillis()的内容之一对于它不是一个单调的时钟源,因此您无法用它可靠地计算经过的时间。如果正在计时的代码在执行时系统时钟发生变化,则会得到奇怪的结果(例如负)。替代使用系统。 Calendar.getInstance().getTime() (*1000000 times) = 402ms new Date().getTime(); (*1000000 times) = 18ms System.currentTimeMillis() (*1000000 times) = 16ms
        long now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            new Date().getTime();
        }
        long result = System.currentTimeMillis() - now;

        System.out.println("Date(): " + result);

        now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            System.currentTimeMillis();
        }
        result = System.currentTimeMillis() - now;

        System.out.println("currentTimeMillis(): " + result);