Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
在Java中,分配引用是否比分配基元类型慢?为什么?_Java_Algorithm_Performance_Jvm - Fatal编程技术网

在Java中,分配引用是否比分配基元类型慢?为什么?

在Java中,分配引用是否比分配基元类型慢?为什么?,java,algorithm,performance,jvm,Java,Algorithm,Performance,Jvm,我编写了一些测试,以确定与分配基元类型值相比,分配引用是慢还是同样快,我的结果是,分配引用要慢得多 @Test public void testPassReference(){ long count = 0; DoublyLinkedNodeNoGetter node1 = linkedList.head; DoublyLinkedNodeNoGetter[] nodes = new DoublyLinkedNodeNoGetter[2]; nodes[0] =

我编写了一些测试,以确定与分配基元类型值相比,分配引用是慢还是同样快,我的结果是,分配引用要慢得多

@Test
public void testPassReference(){
    long count = 0;
    DoublyLinkedNodeNoGetter node1 = linkedList.head;
    DoublyLinkedNodeNoGetter[] nodes = new DoublyLinkedNodeNoGetter[2];
    nodes[0] = linkedList.head.next;
    nodes[1] = linkedList.head.next.next;
    while(count++<10000000000l){
        node1 = nodes[(int)(count%2)];
    }
}

@Test
public void testPassValue(){
    long i = 0;
    long j = 0;
    while(i++<10000000000l){
        j = i%2;
    }
@测试
public void testPassReference(){
长计数=0;
DoublyLinkedNodeNoGetter节点1=linkedList.head;
DoublyLinkedNodeNoGetter[]节点=新的DoublyLinkedNodeNoGetter[2];
节点[0]=linkedList.head.next;
节点[1]=linkedList.head.next.next;

而(count++则速度较慢,因为JVM可以为
int
操作优化代码,特别是如果你有一个微基准,它什么都不做,JVM可以很容易地检测到

但是,在这两种情况下,它都是32位赋值(除非您有一个包含64位引用的大堆),因此底层工作是相同的


顺便说一句,您很可能正在对
%2
或阵列访问的成本进行基准测试,因为这些成本可能要高出一个数量级。

您的基准测试完全错误。 你不需要加热你的代码,你不需要检查,还有很多其他的事情。 看一看,但是你需要了解很多东西来编写一个正确的基准。
您可以将此作为一个示例。

在类似这样的紧密循环中,JVM的JIT编译器将进行大量优化,因此任何度量都将是非常不可靠的。(请发布文本,而不是文本图像的链接!)您的引用测试代码不仅是一个赋值,而且是一个方法调用。您正在比较苹果和梨。@KenY-N嗨,谢谢您的回答。我已经用文本更新了所有内容。很抱歉给您带来不便。@UsagiMiyamoto否。引用是指向对象的一个指针。对象包含自己的类指针。数组查找正在进行中g需要一些时间。你还有苹果和梨。
@Test
public void testPassReference(){
    long count = 0;
    DoublyLinkedNodeNoGetter node1 = linkedList.head;
    DoublyLinkedNodeNoGetter[] nodes = new DoublyLinkedNodeNoGetter[2];
    nodes[0] = linkedList.head.next;
    nodes[1] = linkedList.head.next.next;
    while(count++<10000000000l){
        node1 = nodes[(int)(count%2)];
    }
}

@Test
public void testPassValue(){
    long i = 0;
    long[] j = {1,2};
    long k;
    while(i++<10000000000l){
        k = j[(int)(i%2)];
    }
}