1

I have these two methods in my class. The second method does the same thing but for multiple values in tens of thousands (say fifty thousands). So which one is better to go with: Edit

public static int isUsed(int num) {
    if((port < startPort || port > endPort)) {
        throw new IllegalArgumentException();
    }
    ServerSocket serverSocket;
    try {
        serverSocket = new ServerSocket(port);
        serverSocket.close();
        return false;
    } catch (IOException e) {
        return true;
    }
}

public static int areAllUsed(int arr[]) {
    //do the same thing several thousand times     >>> Is thisbetters  OR
    // call isUsed several thousand times          >>> this is better
}

With better I mean the memmory or performance.

4

4 回答 4

4

如果您需要在多个地方重用一段逻辑,定义一个函数是重用代码的最佳方式。将相同的逻辑复制粘贴到另一个地方并不是一个好主意,因为它会降低可读性并且在您必须更改逻辑时成为维护责任。

几乎没有或根本没有性能影响,因为如果 Java 编译器认为静态方法有益,它会自动内联静态方法。

于 2013-07-28T14:42:55.817 回答
2

在这种情况下,从性能角度来看,方法调用很有可能没有任何区别。对于这么小的方法,JIT 编译器很有可能会在调用它的时候内联方法体。(请注意,它可以对非静态最终方法执行相同的操作,甚至在某些情况下也可以对非静态、非最终方法执行此操作。)

内存使用的差异是微不足道的。


无论哪种方式,尝试事后猜测编译器/优化器通常都是一个坏主意。最好将代码编写为可读和可维护的,让优化器处理优化。如果性能是一个真正的问题,那么使用真实/真实的输入数据来分析你完成的代码......并使用你的分析结果来确定你应该把你的工作导向哪里。

于 2013-07-28T14:44:18.947 回答
2

DRY 是答案:不要重复自己。

如果您已经在 中编码了算法isUsed(),则不要在其他方法中重新实现它。打电话isUsed()

JVM 的效率足以使差异可以忽略不计,甚至不存在,因为该isUsed()方法将由areAllUsed()JIT 动态内联。

于 2013-07-28T14:42:54.190 回答
0

这取决于您的应用程序。我会建议多次调用 isUsed 。您的代码的线性度越低,如果出现问题,调试起来就越容易。如果有问题,你只需要检查 isUsed 是否有错误。

于 2013-07-28T16:34:58.900 回答