在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)];
}
}