我正在为自己做一个程序,然后这个问题就出现了。这个程序处理图形,所以我必须牢记性能。
如果我使用多个变量,或者如果我使用具有硬编码索引的数组,性能是否会有所不同?如果有,哪一个更好?
举例说明:
R = (X * 3.2406) + (Y * -1.5372) + (Z * -0.4986);
G = (X * -0.9689) + (Y * 1.8758) + (Z * 0.0415);
B = (X * 0.0557) + (Y * -0.2040) + (Z * 1.0570);或
RGB[0] = (XYZ[0] * 3.2406) + (XYZ[1] * -1.5372) + (XYZ[2] * -0.4986);
RGB[1] = (XYZ[0] * -0.9689) + (XYZ[1] * 1.8758) + (XYZ[2] * 0.0415);
RGB[2] = (XYZ[0] * 0.0557) + (XYZ[1] * -0.2040) + (XYZ[2] * 1.0570);提前谢谢。
发布于 2012-12-07 09:06:55
使用单独的变量很可能会更快。
为什么?JVM在运行时优化您的代码,使其速度更快。它跟踪每个变量的流和值,以了解如何优化代码。例如,它可能会意识到方法的参数从未赋值过,因此是常量。但它并不是对数组的每个元素都这样做。一个数组被认为是一个巨大的可变变量。因此,当使用单独的变量时,您更有可能获得最佳代码。
发布于 2012-12-07 01:22:19
这肯定是记忆上的不同。
您的第一个场景使用(假设加倍):
8 8 8 8 = 24 bytes
R = (X * 3.2406) + (Y * -1.5372) + (Z * -0.4986);
8 = 32 bytes
G = (X * -0.9689) + (Y * 1.8758) + (Z * 0.0415);
8 = 40 bytes
B = (X * 0.0557) + (Y * -0.2040) + (Z * 1.0570);第二个场景使用:
12 + 8 12 + 8 8 8 = 56 bytes
RGB[0] = (XYZ[0] * 3.2406) + (XYZ[1] * -1.5372) + (XYZ[2] * -0.4986);
8 = 64 bytes
RGB[1] = (XYZ[0] * -0.9689) + (XYZ[1] * 1.8758) + (XYZ[2] * 0.0415);
8 = 72 bytes
RGB[2] = (XYZ[0] * 0.0557) + (XYZ[1] * -0.2040) + (XYZ[2] * 1.0570);参考:http://www.javamex.com/tutorials/memory/object_memory_usage.shtml
发布于 2012-12-07 01:32:30
你应该想得更远一点:
x,y,z值从何而来?
您有坐标的x[]、y[]和z[]数组吗?你在哪里迭代?
for (int i = 0; i < len; i++) {
process(x[i], y[i], z[i];
}毫无疑问,这会更快地在内部迭代:
公共空进程(双x[]、双y[]、双z[]) {
for (int i = 0; i < len; i++) {
rbgb[0] = (x[i] * 3.24606 + y[i] * 1.5372 + z[i] * -0.4986);
}}
https://stackoverflow.com/questions/13748872
复制相似问题