Java calendar.getInstance()或calendar.clone()文件
我需要将给定日期复制100次(我不能通过引用传递)。我想知道下面两个选项中哪一个更好Java calendar.getInstance()或calendar.clone()文件,java,performance,Java,Performance,我需要将给定日期复制100次(我不能通过引用传递)。我想知道下面两个选项中哪一个更好 newTime=Calendar.getInstance().setTime(originalDate); 或 表演是这里的主要内容 thx.我会用 newTime= (Calendar) originalDate.clone(); 我的方法是选择选项1),然后确保彻底分析应用程序以检查瓶颈。在一天结束时,上述代码可能根本不是应用程序整体性能的问题 我的直觉告诉我,克隆()会更快 为什么不使用快速基准测试[
newTime=Calendar.getInstance().setTime(originalDate);
或
表演是这里的主要内容
thx.我会用
newTime= (Calendar) originalDate.clone();
我的方法是选择选项1),然后确保彻底分析应用程序以检查瓶颈。在一天结束时,上述代码可能根本不是应用程序整体性能的问题
date.getTime()
日历
,或日期
,请随意修改测试
(作为对注释的回应:为了提高测试精度,您还可以单独运行测试,增加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]