什么时候更好地保存函数的结果而不是再次调用它?

时间:2014-01-18 15:42:11

标签: java optimization memory-management

假设我在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次,我应该将值保存在变量中,但在这种情况下,我们只是在一个函数调用或使用整数变量之间进行决定。

3 个答案:

答案 0 :(得分:3)

JIT将内联简单的方法,如length()如果您想要提高性能,则必须查看不同的算法。

你可以做的事情是假设一个数组已经满0,所以你不需要将它归零。注意:您可能有字符&gt; 255。

另外,我会返回char,因为您没有null值。

答案 1 :(得分:2)

通常,优化何时可以衡量优化1)是否有益,2)是否值得。值得一提,我的意思是可读性的降低保证了性能的提高。第1点意味着您的更改可能是有害的,或者可能不会做任何事情。

例如,添加局部变量会使方法的堆栈更大,这可能比极端环境中的运行时增益更糟糕。此外,String.length()只返回变量的值,因此不调用该方法不会为您节省太多。您的JIT可能(也可能会)优化循环条件,这意味着您的优化实际上并不是有益的。

答案 2 :(得分:1)

这实际上取决于你打电话的功能。由于您正在调用String.length(),因此即使返回值不会发生变化,也可以在同一上下文中多次调用它。

但是,在变量中缓存函数返回值被认为是最佳实践,尤其是对于复杂函数。在你的情况下,没有太大的区别。