在 java 中交换对象或基元是否更昂贵?
Is it more expensive to swap objects or primitives in java?
假设我有一些可比较对象的数组。为方便起见,考虑 Integer。但实际上它可能是一些虚构的数据类型,例如 Car 或 Stuff。进一步说,我需要找到极值。交换指数更便宜吗?对象?或者没关系?换句话说,例子A或例子B更便宜
示例 A
int least = 0;
for(int i=1; i<objects.length;i++)
if(objects[i].isLessThan(objects[least)) least= i;
示例 B
Stuff least = objects[0];
for(int i=1; i<objects.length;i++)
if(objects[i].isLessThan(objects[least)) least= objects[i];
在Java中,每个变量要么是原始类型,要么是引用类型(Car
类型的变量仅包含对Car
实例的引用)。也就是说,所有变量最多为 64 位大,并且可以在单个 cpu 指令中分配。长话短说:没关系。
应该是一样的。如果您没有首先访问 objects[i]
来执行比较,那么由于 CPU 缓存外部的内存访问而引入的延迟可能是一个问题,但由于您已经访问了 objects[i]
,这不太可能成为问题。
在非常大的数组中,大于缓存的页面大小,交换对象可能会更快,因为您不需要为每次比较检索 objects[least]
,但这是推测。
java 中的一个引用,如果您要复制一个对象,您将要复制的内容在 32 位机器上是 32 位,在 64 位机器上是 64 位。
另一方面,原始类型取决于哪种类型。例如,一个字节是 8 bits wheras an integer is 32 因此复制一个整数的成本与复制指针的时间一样多(或在 64 位机器上是一半)。
最后,真的 无关紧要,因为您只是复制引用,而不是指向的数据。
假设我有一些可比较对象的数组。为方便起见,考虑 Integer。但实际上它可能是一些虚构的数据类型,例如 Car 或 Stuff。进一步说,我需要找到极值。交换指数更便宜吗?对象?或者没关系?换句话说,例子A或例子B更便宜
示例 A
int least = 0;
for(int i=1; i<objects.length;i++)
if(objects[i].isLessThan(objects[least)) least= i;
示例 B
Stuff least = objects[0];
for(int i=1; i<objects.length;i++)
if(objects[i].isLessThan(objects[least)) least= objects[i];
在Java中,每个变量要么是原始类型,要么是引用类型(Car
类型的变量仅包含对Car
实例的引用)。也就是说,所有变量最多为 64 位大,并且可以在单个 cpu 指令中分配。长话短说:没关系。
应该是一样的。如果您没有首先访问 objects[i]
来执行比较,那么由于 CPU 缓存外部的内存访问而引入的延迟可能是一个问题,但由于您已经访问了 objects[i]
,这不太可能成为问题。
在非常大的数组中,大于缓存的页面大小,交换对象可能会更快,因为您不需要为每次比较检索 objects[least]
,但这是推测。
java 中的一个引用,如果您要复制一个对象,您将要复制的内容在 32 位机器上是 32 位,在 64 位机器上是 64 位。
另一方面,原始类型取决于哪种类型。例如,一个字节是 8 bits wheras an integer is 32 因此复制一个整数的成本与复制指针的时间一样多(或在 64 位机器上是一半)。
最后,真的 无关紧要,因为您只是复制引用,而不是指向的数据。