Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 calendar.getInstance()或calendar.clone()文件_Java_Performance - Fatal编程技术网

Java calendar.getInstance()或calendar.clone()文件

Java calendar.getInstance()或calendar.clone()文件,java,performance,Java,Performance,我需要将给定日期复制100次(我不能通过引用传递)。我想知道下面两个选项中哪一个更好 newTime=Calendar.getInstance().setTime(originalDate); 或 表演是这里的主要内容 thx.我会用 newTime= (Calendar) originalDate.clone(); 我的方法是选择选项1),然后确保彻底分析应用程序以检查瓶颈。在一天结束时,上述代码可能根本不是应用程序整体性能的问题 我的直觉告诉我,克隆()会更快 为什么不使用快速基准测试[

我需要将给定日期复制100次(我不能通过引用传递)。我想知道下面两个选项中哪一个更好

newTime=Calendar.getInstance().setTime(originalDate);

表演是这里的主要内容

thx.

我会用

newTime= (Calendar) originalDate.clone();

我的方法是选择选项1),然后确保彻底分析应用程序以检查瓶颈。在一天结束时,上述代码可能根本不是应用程序整体性能的问题

  • 我的直觉告诉我,克隆()会更快
  • 为什么不使用快速基准测试[*]来尝试呢
  • 如果不必进行日历计算,可以考虑只使用长值
    date.getTime()
  • [*]

    PS我不确定,如果您真的需要
    日历
    ,或
    日期
    ,请随意修改测试

    (作为对注释的回应:为了提高测试精度,您还可以单独运行测试,增加N的值,…)

    我不能通过引用来传递


    你当然不能。Java中没有这样的东西。但我会重新考虑这个要求。如果你一直传递同一个日期,有人修改日期的实际风险是什么?你能控制吗?e、 g.通过在每次调用之前和之后检查getTime(),并在每次调用发生变化时抛出RTE?

    在Scala中,我将使用.asInstanceOf[Calendar]执行克隆()并转换到Calendar,如:

    val now = Calendar.getInstance()
    val newDate = now.clone().asInstanceOf[Calendar]
    

    为什么不测试和分析这两种情况呢?我可以,但问题是我是否可以编写有效的单元测试。我在java 1.4中读到clone()比new操作符慢(在使用JIT时),我相信…我在java 5及更高版本中找不到这一点…
    Calendar\setTime(Date)
    返回
    void
    ,您的示例在调用
    newTime.getTime()时无效
    传递对originalDate的引用或传递对originalDate深层副本的引用?您的测试存在缺陷,因为第二个循环得益于从第一个循环加载和预热缓存。您需要分别运行每个测试用例。@Steve:很容易做到:只需注释掉您不想运行的测试用例。。。对我来说,这不会改变结果。事实上,这是相当不相关的反正,因为第二个是较慢的。。。(顺便说一句,我只是想用一种简单、快速、肮脏的方式来测试它,用一种非常简短的格式)如果第二次测试使用了另一个日期对象,e。g<代码>最终日期=新日期()和相应的
    校准设置时间(日期)?克隆日历的4种方法的计时:非常好的性能!非常感谢。我将更频繁地使用
    clone()
    。为什么要使用它而不是“新的”?我想你忘记了(日历)演员阵容
    originalDate.clone()为您提供
    视图
    。因此,我们需要将它转换为Calendar,正如@tviana提到的:
    Calendar newTime=(Calendar)originalDate.clone()这是防御性编码…由于我们所从事的业务的性质,日期的意外更改可能会引起巨大的法律诉讼。。。
    
    private static final int N = 100000;
    
    public static void main(final String[] args) throws Exception {
    
        final Date date = new Date();
    
        {
            final long start = System.currentTimeMillis();
            for (int i = 0; i < N; i ++) {
                final Date date2 = (Date) date.clone();
            }
            final long end = System.currentTimeMillis();
            System.out.println("Clone: " + (end - start) + " ms");
        }
        {
            final long start = System.currentTimeMillis();
            for (int i = 0; i < N; i ++) {
                final Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                final Date date2 = cal.getTime();
            }
            final long end = System.currentTimeMillis();
            System.out.println("Caldendar.setTime: " + (end - start) + " ms");
        }
    }
    
    Clone: 13 ms
    Caldendar.setTime: 317 ms
    
    val now = Calendar.getInstance()
    val newDate = now.clone().asInstanceOf[Calendar]