11

Java中更快的是什么。直接多次访问数组索引,或者将数组索引的值保存到一个新变量中并将其用于后续计算?

访问索引

if ((shape.vertices[0].x >= fromX && shape.vertices[0].x <= toX) || // left side of shape in screen
    (shape.vertices[0].x <= fromX && shape.vertices[0].x + shape.width >= fromX) || // right side of shape in screen
    (shape.vertices[0].x >= fromX && shape.vertices[0].x + shape.width <= toX)) { // shape fully in screen

    // ...
}

临时变量

float x = shape.vertices[0].x;
float y = shape.vertices[0].y;
if ((x >= fromX && x <= toX) || // left side of shape in screen
    (x <= fromX && x + shape.width >= fromX) || // right side of shape in screen
    (x >= fromX && x + shape.width <= toX)) { // shape fully in screen

        // ...
    }
4

6 回答 6

7

第二种方法肯定更快。final但是您可以使用关键字提供更多帮助:

final float x = shape.vertices[0].x;
final float y = shape.vertices[0].y;
final int rightEdge = x + shape.width;
if ((x >= fromX && x <= toX) || // left side of shape in screen
(x <= fromX && rightEdge >= fromX) || // right side of shape in screen
(x >= fromX && rightEdge <= toX)) { // shape fully in screen

    // ...
}

当然不是一个显着的改进(但仍然是一个改进并且也明确了意图)。您可以阅读此讨论: http: //old.nabble.com/Making-copy-of-a-reference-to-ReentrantLock-tt30730392.html#a30733348

于 2012-04-19T15:35:11.857 回答
2

从长远来看,声明一个临时数组会更快,因为 jvm 在访问数组元素时必须计算偏移量。

使用分析工具,看看哪个更适合您使用,但我提醒您,除非您正在做一些非常密集且对时间非常敏感的事情,否则这不会是一个巨大的改进。

于 2012-04-19T15:39:10.173 回答
1

通过分析器运行代码以回答您的用例的问题。

这个问题的答案可能是特定于 JVM 的。Oracle HotSpot JVM 的性能将不同于 OpenJDK 或 IBM 的 JDK。时间将取决于 JVM 如何优化字节码,它决定在运行时编译什么。服务器与客户端模式也可能会有所不同。

因此,以可读性为目标。在分析并确定那段代码是问题之后进行优化。

于 2012-04-19T15:58:05.943 回答
0

第二种方法更快,但会消耗更多内存。但是性能提升只有纳秒,除非你的数组大小很大。

于 2012-04-19T15:37:46.313 回答
-1

数组访问可能会更快。请注意以下程序:

public class ArraySpeedTest{

public static void main(String [] args){

    float x = 4.4f;
    float [] xArr = new float[1];
    xArr[0] = 4.4f;

    long time1 = System.nanoTime();
    for(int i = 0 ; i < 1000*1000*1000; i++){
        if(x > 1 && x < 5){

        }
    }
    long time2 = System.nanoTime();

    System.out.println(time2-time1);

    long time3 = System.nanoTime();
    for(int i = 0 ; i < 1000*1000*1000; i++){
        if(xArr[0] > 1 && xArr[0] < 5){
        }
    }
    long time4 = System.nanoTime();

    System.out.println(time4-time3);


}

}

输出:: 5290289 2130667

JVM 实现、标志和程序顺序可以在几毫秒的量级上改变性能。

于 2012-04-19T15:48:25.640 回答
-1

我会推荐第二种方法,仅仅是因为它更具可读性并且对可维护性有很大帮助。

性能提升,除非你的阵列很大,否则真的很小。

另一方面,可读性的提升总是值得接受的。

于 2012-04-19T15:37:11.140 回答