Java性能与代码风格:从同一行代码进行多个方法调用

amp*_*ent 6 java performance coding-style

我很好奇是否在同一行代码中打包多个和/或嵌套方法调用对性能更好,这就是为什么一些开发人员这样做,代价是使代码的可读性降低.

例如

//like
Set<String> jobParamKeySet = jobParams.keySet();
Iterator<String> jobParamItrtr = jobParamKeySet.iterator();
Run Code Online (Sandbox Code Playgroud)

也可以写成

//dislike    
Iterator<String> jobParamItrtr = jobParams.keySet().iterator();
Run Code Online (Sandbox Code Playgroud)

就个人而言,我讨厌后者,因为它在同一行中进行了多次评估,并且我很难阅读代码.这就是为什么我试图通过各种方式避免每行代码进行多次评估.我也不知道,jobParams.keySet()返回Set和我的错误.
另一个例子是:

//dislike
Bar.processParameter(Foo.getParameter());
Run Code Online (Sandbox Code Playgroud)

VS

//like
Parameter param = Foo.getParameter();
Bar.processParameter(param);
Run Code Online (Sandbox Code Playgroud)

前者让我感到有毒和头晕,因为我喜欢在每行代码中使用简单而干净的评估,当我看到其他人编写的代码时,我就讨厌它.

但是在同一行中打包多个方法调用有什么(性能)好处吗?

编辑:由于@stemm提醒,单线程也更难调试

kos*_*osa 6

微优化是杀手锏.如果您显示的代码引用是实例范围(或)方法范围,我将采用第二种方法.

方法执行完成后,方法范围变量将符合GC的条件,因此即使您声明另一个变量,也可以,因为范围有限,并且您获得的优势将是可读的和主表代码.


Eri*_* B. 5

我倾向于不同意此列表中的大多数其他人.我实际上发现第一种方式更清洁,更容易阅读.

在你的例子中:

//like
Set<String> jobParamKeySet = jobParams.keySet();
Iterator<String> jobParamItrtr = jobParamKeySet.iterator();
Could be also written as

//dislike    
Iterator<String> jobParamItrtr = jobParams.keySet().iterator();
Run Code Online (Sandbox Code Playgroud)

第一种方法(你喜欢的方法)有很多不相关的信息.例如,迭代器接口的重点是为您提供一个标准接口,您可以使用它来遍历任何后备实现.因此,它是一个键集的事实与代码本身无关.您正在寻找的是循环实现的对象的迭代器.

其次,第二个实现实际上为您提供了更多信息.它告诉你代码将忽略jobParams的实现,并且它只会循环遍历键.在第一个代码中,您必须首先追溯jobParamKeySet(作为变量)以找出您正在迭代的内容.此外,您不知道在作用域中的其他位置是否使用了jobParamKeySet.

最后,作为最后一条评论,第二种方式可以在必要时更轻松地切换实现; 在第一种情况下,您可能需要重新编码两行(第一个变量赋值,如果它从一个集合更改为其他内容),而第二个案例您只需要更改一行.

话虽如此,一切都有限制.在一行中链接10个调用可能很难读取和调试.然而,通常很清楚3或4级.有时,特别是如果需要多次中间变量,则明确声明它更有意义.

在你的第二个例子中:

//dislike
Bar.processParameter(Foo.getParameter());
vs

//like
Parameter param = Foo.getParameter();
Bar.processParameter(param);
Run Code Online (Sandbox Code Playgroud)

我发现实际上更难理解正在处理哪些参数Bar.processParameter(param).我需要更长的时间来匹配param变量实例化才能看到它Foo.getParameter().鉴于第一种情况,信息非常清晰并且表现得非常好 - 您正在处理Foo.getParameter()参数.就个人而言,我发现第一种方法也不容易出错 - Foo2.getParamter()当它在同一个调用中而不是单独的一行时,你不太可能意外使用它.