重复的函数调用与存储结果的临时变量

时间:2014-09-09 06:48:33

标签: java performance

我的代码看起来像:

class Main {
    public static void main(String args[]){
         String[] s1 = {"This ", "is ", "a ","sentence ", "."}; 
         String sentence = Arrays.toString(s1);
         System.out.println(sentence.substring(4, sentence.length()-1));
    }

    private static <T> String arrayToString(T[] t){
         StringBuilder sb = new StringBuilder();
         for(T val: t){
            sb.append(val.toString());
         }
    }
}

我尝试在一行中执行以上操作:

System.out.println(arrayToString(s1).substring(
                                       4, arrayToString(s1).length()));

我的问题是我多次调用arrayToString()方法以避免存储对计算值的引用。

  1. 是否会多次执行arrayToString计算?
  2. Java中是否有一些机制可以减少这些多次调用的惩罚?
  3. 我最好使用以前版本的代码吗?

2 个答案:

答案 0 :(得分:2)

  1. 变量是最简单的方法。你也可以实现某种形式的缓存/ memoization,这样当你调用一个函数时,它会检查它是否已经计算过去的结果并直接返回它。
  2. 是的 - 它在几个方面更好。首先,你不会最终调用arrayToString两次,而另一个,它更具可读性,因为我们现在知道arrayToString正在返回某种类似“句子”的对象。使用该变量可以添加更多有用的上下文,并使代码更具可读性。

答案 1 :(得分:1)

通常,在使用Java进行编码时,您应该认识到在更频繁地执行代码时,您的代码是实时编译的。自计算

arrayToString(s1).substring(4, arrayToString(s1).length())

是可预测的,你可以预期,一旦即时编译器启动,就应该解决性能损失,因为它会为你自己的计算创建一个缓存。这当然是对任何代码进行优化的过于乐观的假设,但对于Java,通常最好坚持编写可读代码而不要过多担心性能,代码抽象和性能之间的差距部分地被桥接所消除。 Java虚拟机。

通常,您可以使用我只能推荐的JIT watch等工具来监控已编译代码的性能。有时很难确定性能瓶颈,但根据我的经验,像你这样的代码永远不会导致糟糕的用户体验,因为它只是处理一个需要几个时钟周期的简单字符串,这甚至不足以ping数据库。就在您阅读本文时,我的手机可能已完成数十亿次计算。

总而言之,人们对性能的担忧太多了。编写可维护且可读的代码应始终是您的主要目标。