我试图测量原始数据类型的执行时间及其包装类来计算相同的数字。我得到的包装类比原始数据类型花费更多时间。
以下代码中原始t1 = 5的执行时间和包装类t2的执行时间= 31。
import java.io.*;
import java.util.*;
public class Performance
{
public static long primitive(int count)
{
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
count++;
System.out.println(count);
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
return elapsedTime;
}
public static long wrapper(Integer count)
{
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
count++;
System.out.println(count);
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
return elapsedTime;
}
public static void main(String args[])
{
Integer c = new Integer(0);
long t2=Performance.wrapper(c);
int count=0;
long t1=Performance.primitive(count);
System.out.println("t1="+t1+"t2="+t2);
}
}
由于Wrapper类(Integer)或其他任何东西的对象创建是否存在性能差异?
答案 0 :(得分:10)
你这里的基本事情确实是错误的。
首先,编写一个优秀的微基准测试远远超出了您在代码中所做的工作;有关指导,请参阅here。
然后:你必须了解你想要进行基准测试的事情。对不起,你显然没有。像这里:
public static long wrapper(Integer count)
{
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
count++
整数对象不可变。此代码不仅“添加”Integer对象,而且每次迭代创建一个新的Integer对象。
当然:您的代码甚至不会使用计算结果。如果JVM / JIT注意到,它可能完全抛弃循环并添加构造。所以你的方法应该至少返回count的最终值;并且调用者应打印该结果。
并回答您的具体问题:当然使用引用类型包装类需要付出一定的代价。当你的程序正在处理(实际上)要处理的大量元素时,那么使用整数列表确实比使用int数组要高得多。当你不注意并且你在代码中进行隐式自动装箱/拆箱时,那真的可以 hurt 。
但真正的答案是:你专注于错误的事情。你知道,你的第一个优先级应该是做一个伟大的设计,然后是经过充分测试,健壮,可读,可维护的实现。当然,你不应该做完全愚蠢的事情并浪费性能,但是,在你担心性能之前,你最好担心关于你的Java技能。
长话短说:专注于理解java和“我如何创造一个好的设计”;并且忘记关于“表现”了。在应用程序中出现真正的问题时,您只需要处理“性能”。然后你进行真正的分析,以确定根本原因并修复它。