Java中长方法链的优化

时间:2017-12-07 22:22:35

标签: java optimization methods chaining

在应用程序中分析一些预先存在的第三方Java代码(无法重写),我发现它几乎完全是在长方法链上构建的,形式为

public Object process() {
  // Do some class-specific stuff
  return this.getChild().process();
}

其中有一个定义process()方法的基类,由重新定义该方法的子类继承,最后重复getChild()调用。

在运行时由于条件块而创建(分支)多个这样的链,其中一些可能相对较早地返回(例如,在链中的10-20和#34;链接之后),但大多数通常"长度"在返回结果之前,链的数量要大得多,甚至可以超过100个连续的方法调用。

应用程序使用此代码处理大型文件,每次调用顶级方法时结果都会发生变化,通常每个文件的每个不同行一次。

所以,有两个问题:

  • 与常规"相比,这种设计应该具有什么样的性能影响?一个?
  • 是否有任何技巧可以显着提高该代码的性能(例如,通过更改某些JVM参数)?

2 个答案:

答案 0 :(得分:2)

方法调用非常快(每秒10秒或100万),因此首先要通过分析系统来确保它真正有用。

否则,您可以使用缓存来提高效率,尤其是在结果一致的情况下(输入相同,输出相同)。

例如:

Object cache = null;

public Object process() {
   if (cache == null)
      cache = this.getChild().process();

   return cache;
}

如果涉及某种输入或状态,则可以使用Map作为缓存,该缓存使用输入值的键并存储输出值的值。

答案 1 :(得分:1)

表格声明

return getChild().process();

没有区别
SomeType var = getChild();
return var.process();

在这两种情况下,一个方法将在另一个方法之后调用,getChild()的返回值将用作process()调用的接收方。

如果您正在寻找不相关的次要技术细节,则第一个表单不需要本地变量。但是因为在HotSpot中,在创建线程时预先分配了固定大小的堆栈内存,所以不可能察觉到这两种形式之间的任何差异。

这两种形式之间的选择纯粹是一种风格。