假设我在java中有这个功能
public static Character firstNonrepeatedChar(String in) {
int[] repeated = new int[256];
for(int i=0; i<256; i++){
repeated[i] = 0;
}
// First time calling in.length()
for(int j=0; j<in.length(); j++){
repeated[in.charAt(j)]++;
}
// Second time calling in.length()
// I could have used "int length = in.length() and use this variable in this second loop"
for(int j=0; j<in.length(); j++){
if(repeated[in.charAt(j)] == 1)
return in.charAt(j);
}
return null;
}
正如你所看到的,我已经使用了两次in.length()。另一种方法是将in.length()保存在变量中并使用该变量。谁能告诉我这有多大的不同?我知道如果我想要使用该值100次,我应该将值保存在变量中,但在这种情况下,我们只是在一个函数调用或使用整数变量之间进行决定。
答案 0 :(得分:3)
JIT将内联简单的方法,如length()
如果您想要提高性能,则必须查看不同的算法。
你可以做的事情是假设一个数组已经满0,所以你不需要将它归零。注意:您可能有字符&gt; 255。
另外,我会返回char
,因为您没有null
值。
答案 1 :(得分:2)
通常,优化何时可以衡量优化1)是否有益,2)是否值得。值得一提,我的意思是可读性的降低保证了性能的提高。第1点意味着您的更改可能是有害的,或者可能不会做任何事情。
例如,添加局部变量会使方法的堆栈更大,这可能比极端环境中的运行时增益更糟糕。此外,String.length()
只返回变量的值,因此不调用该方法不会为您节省太多。您的JIT可能(也可能会)优化循环条件,这意味着您的优化实际上并不是有益的。
答案 2 :(得分:1)
这实际上取决于你打电话的功能。由于您正在调用String.length()
,因此即使返回值不会发生变化,也可以在同一上下文中多次调用它。
但是,在变量中缓存函数返回值被认为是最佳实践,尤其是对于复杂函数。在你的情况下,没有太大的区别。