Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/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
JDK是否对自己的API进行了一些优化?_Api_Arraylist_Jvm_Java - Fatal编程技术网

JDK是否对自己的API进行了一些优化?

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

大家好,我已经将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>();
    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) 对于研究,您可以使用其中一个基准库:

4) 一般来说,您的问题的答案是:,在某些情况下,Sun/Oracle的JVM hot会使用针对给定操作系统/硬件优化的实现替换一些JDK代码,如
Math.sqrt()

1)使用
System.nanoTime()
可能会给您扭曲的结果,因为它取决于操作系统的调度程序粒度:

此方法提供纳秒精度,但不一定是纳秒分辨率(即值变化的频率)-除分辨率至少与currentTimeMillis()的分辨率一样好外,不作任何保证

2) 要获得有意义的基准测试,必须首先预热JVM

3) 对于研究,您可以使用其中一个基准库:

4) 一般来说,您的问题的答案是:,在某些情况下,Sun/Oracle的JVM hot将一些JDK代码(如
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被占用(比如,在开发环境中绘制控制台视图),这将计入报告的时间


      您正在亲身体验微基准测试的危险,尤其是当您未正确设置微基准测试时。您正在亲身体验微基准测试的危险,尤其是当您未正确设置微基准测试时。