我编写测试来确定与分配基元类型值相比,分配引用是否更慢或同样快,而我的结果是,分配引用要慢得多。
@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;
}
结果:
testPassReference:8s 934ms
testPassValue:2s 707ms
我很困惑,因为根据我的理解,当使用'='分配对象时,它意味着将引用(即地址)从一个对象传输到另一个对象。即使在64位系统中,引用的长度也应为64位,这是原始类型“long”的长度。那么为什么分配参考是如此之慢?在我们将引用分配给另一个时发生了什么?
感谢您的帮助! 谢谢!
更新:
感谢您的评论!
我的测试方法存在缺陷。我还在考虑如何对它们进行公平的测试。 T.T
那么,忘了测试,理论上这两种作业有什么不同吗?
UPDATE2:
@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)];
}
}
我再次重新设计了测试,现在我得到了类似的结果。所以我认为分配的类型对操作性能几乎没有影响。
testPassReference:9s 5ms
testPassValue:9s 4ms