JDK是否对自己的API进行了一些优化?
大家好,我已经将ArrayList源代码从java.util包复制到了我自己的包中。但我发现它运行的是solwer,而不是原来的java.util.ArrayList 测试代码:JDK是否对自己的API进行了一些优化?,api,arraylist,jvm,java,Api,Arraylist,Jvm,Java,大家好,我已经将ArrayList源代码从java.util包复制到了我自己的包中。但我发现它运行的是solwer,而不是原来的java.util.ArrayList 测试代码: @Test public void jdkApiPerformance() { long startTime = System.nanoTime(); java.util.ArrayList<Object> list = new java.util.ArrayList<Object&g
@Test
public void jdkApiPerformance() {
long startTime = System.nanoTime();
java.util.ArrayList<Object> list = new java.util.ArrayList<Object>();
long costTime = System.nanoTime() - startTime;
System.out.println("jdkPerformance cost " + costTime + "ns.");
}
@Test
public void myApiPerformance() {
long startTime = System.nanoTime();
question.jdk.ArrayList<Object> list = new question.jdk.ArrayList<Object>();
long costTime = System.nanoTime() - startTime;
System.out.println("apiPerformance cost " + costTime + "ns.");
}
@测试
公共无效jdkApiPerformance(){
long startTime=System.nanoTime();
java.util.ArrayList=新建java.util.ArrayList();
long costTime=System.nanottime()-startTime;
System.out.println(“jdkPerformance成本”+成本时间+“ns”);
}
@试验
公共绩效{
long startTime=System.nanoTime();
question.jdk.ArrayList list=新question.jdk.ArrayList();
long costTime=System.nanottime()-startTime;
System.out.println(“API性能成本+成本时间+ns”);
}
此测试的输出为:
jdkPerformance cost 10263ns.
apiPerformance cost 1244158ns.
JDK性能成本为10263纳秒。
API性能成本为1244158ns。
显然,我的api比JDK api运行得慢
然后我为这个测试添加了@Before方法:
@Before
public void setUp() {
new java.util.ArrayList<Object>();
new question.jdk.ArrayList<Object>();
}
@之前
公共作废设置(){
新的java.util.ArrayList();
new question.jdk.ArrayList();
}
这种情况下的输出更改为:
jdkPerformance cost 9932ns.
apiPerformance cost 1324ns.
JDK性能成本为9932ns。
API性能成本为1324ns。
我的api比JDK api运行得快!!?
对于这种情况我真的很困惑。请帮助我。谢谢。1)使用System.nanoTime()
可能会给你扭曲的结果,因为它依赖于操作系统的调度程序粒度:
此方法提供纳秒精度,但不一定是纳秒分辨率(即值变化的频率)-除分辨率至少与currentTimeMillis()的分辨率一样好外,不作任何保证
2) 要获得有意义的基准测试,必须首先预热JVM
3) 对于研究,您可以使用其中一个基准库:
Math.sqrt()
。1)使用System.nanoTime()
可能会给您扭曲的结果,因为它取决于操作系统的调度程序粒度:
此方法提供纳秒精度,但不一定是纳秒分辨率(即值变化的频率)-除分辨率至少与currentTimeMillis()的分辨率一样好外,不作任何保证
2) 要获得有意义的基准测试,必须首先预热JVM
3) 对于研究,您可以使用其中一个基准库:
Math.sqrt()
)替换为针对给定操作系统/硬件优化的实现。- JVM根据需要加载类。由于java.util.ArrayList是这样一个基本类,它可能在基准测试开始之前就已经被加载了,但question.jdkArrayList可能是第一次使用。这需要磁盘I/O来读取类文件,这本身比创建新实例所需的时间要多几个数量级。此外,java.util.ArrayList更有可能已由JIT编译器优化
- 根据其javadoc,System.nanoTime()具有“纳秒精度,但不一定是纳秒精度”。用它来测量一微秒级的延迟充其量只是一种冒险。此外,它测量的是墙上的时钟时间,而不是cpu时间。如果cpu被占用(比如,在开发环境中绘制控制台视图),这将计入报告的时间
- JVM根据需要加载类。由于java.util.ArrayList是这样一个基本类,它可能在基准测试开始之前就已经被加载了,但question.jdkArrayList可能是第一次使用。这需要磁盘I/O来读取类文件,这本身比创建新实例所需的时间要多几个数量级。此外,java.util.ArrayList更有可能已由JIT编译器优化
- 根据其javadoc,System.nanoTime()具有“纳秒精度,但不一定是纳秒精度”。用它来测量一微秒级的延迟充其量只是一种冒险。此外,它测量的是墙上的时钟时间,而不是cpu时间。如果cpu被占用(比如,在开发环境中绘制控制台视图),这将计入报告的时间