我试图测量原始数据类型及其包装类的执行时间,以计数相同的数字。我知道包装类比原始数据类型花费更多的时间。
在下面的代码中,原始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);
}
}是否由于包装类(Integer)的对象创建或其他原因而导致性能差异?
发布于 2016-11-01 19:38:41
你在这里搞错了重要的事情。
首先,编写一个好的微基准测试远远超出了您在代码中所做的工作;有关一些指导原则,请参阅here。
然后:你必须了解你想要测试的东西。抱歉,你显然不知道。就像这里:
public static long wrapper(Integer count)
{
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
count++整数对象是不变的。此代码不仅“添加”整数对象,而且在每次迭代时创建一个新的整数对象。
当然,您的代码甚至不使用,而是使用计算结果。如果JVM/JIT注意到这一点,它可能会完全丢弃循环和添加构造。因此,您的方法至少应该返回count的最后值;调用方应该打印该结果。
为了回答您的具体问题:当然,使用引用类型包装器类需要付出一定的代价。当您的程序处理(实际上)大量要处理的元素时,使用Integer 列表比使用int数组的成本要高得多。当您不注意并且在代码中执行隐式自动装箱/取消装箱时,这实际上可以是hurt。
但真正的答案是:你的注意力集中在错误的事情上。您知道,的第一个优先级应该是做一个伟大的设计,然后是一个经过良好测试的、健壮的、可读的、可维护的实现。当然,您不应该做完全愚蠢的事情和浪费性能,但是在您担心性能之前,最好是担心一般的Java技能。
长话短说:专注于理解java和“如何创建一个好的设计”;暂时忘掉“性能”。你只需要处理“性能”时,它是一个真正的问题,在你的应用程序。然后进行真正的分析,以确定根本原因并修复它。
https://stackoverflow.com/questions/40367376
复制相似问题