【问题标题】:How Java 8 Lambdas compare to plain method calls when Collections are not involved?当不涉及集合时,Java 8 Lambda 与普通方法调用相比如何?
【发布时间】:2014-05-08 18:56:46
【问题描述】:

在 Java 8 中,选择使用函数式接口而不是普通方法调用对性能有何影响?

假设我必须多次调用一个方法,并为其 5 个参数中的 3 个使用重复值:

boolean isGood = getIsGood();
boolean isOk = getIsOk();
int year = getYear();

processCitiesByYear("Germany", "Berlin", isGood, isOk, year);
processCitiesByYear("USA", "New York City", isGood, isOk, year);
processCitiesByYear("Italy", "Rome", isGood, isOk, year);
processCitiesByYear("Japan","Tokyo", isGood, isOk, year);
processCitiesByYear("Canada","Montreal", isGood, isOk, year);
processCitiesByYear("Spain","Madrid", isGood, isOk, year);

我可以创建一个java.util.function.BiConsumer 以避免“isGood, isOk, year”重复,并使代码更具可读性(恕我直言):

boolean isGood = getIsGood();
boolean isOk = getIsOk();
int year = getYear();

BiConsumer<String, String> processGoodAndOkInYear= 
    (country, city) -> {
        processCitiesByYear(country, city, isGood, isOk, year);
    };

processGoodAndOkInYear.accept("Germany", "Berlin");
processGoodAndOkInYear.accept("USA", "New York City");
processGoodAndOkInYear.accept("Italy", "Rome");
processGoodAndOkInYear.accept("Japan","Tokyo");
processGoodAndOkInYear.accept("Canada","Montreal");
processGoodAndOkInYear.accept("Spain","Madrid");

这种“设计模式”是否会严重牺牲性能?或者 JVM 是否神奇地 turns my processGoodAndOkInYear into compiled code 并证明它实际上比 5 个参数调用更有效?

【问题讨论】:

  • 你自己分析后得到了什么结果?
  • 好问题。我认为答案最好用一句荷兰谚语来概括:“meten is weten”。基本上:确定,测量它!
  • 起初我想进行测量,但后来我注意到参数的数量(重复和不重复)、方法调用的数量、功能接口的组合(比如 BiFunction, Predicate>)... 我相信了解内部工作原理可以更好地回答我对整体“设计模式”的疑问。

标签: java performance lambda


【解决方案1】:

嗯,我认为 Lambda 不会比方法调用更快,但应该非常接近。您可以查看以下链接:

现在,我不会在这里使用 Lambda,因为一个简单的包装方法就可以了:

private void processGoodAndOkin2001(String country, String city) {
    processCitiesByYear(country, city, true, true, 2001);
}

Perfs 将与此类似。

【讨论】:

  • 当我们在编译时知道重复的参数值时,包装方法当然更好,就像我的示例代码一样。一个更好的例子是使用变量作为重复传递的值。感谢您指出。
  • 嗯,方法名称暗示了这种情况下重复的参数值。但你在这件事上是对的。在这种情况下,您始终可以在包装方法中调用 getGood() 和 getOK() 方法。
  • 不,我不能,除非我假设 getGood() 和 getOk() 没有副作用。例如,假设 getGood() 以交互方式要求用户选择“是”或“否”。
  • 我认为这并不重要。然后,您的应用程序将挂在那里,等待用户输入。即便如此,Lambdas 将如何更好地解决这个问题(对于 Lambdas 来说还是新手,所以我可能没有得到任何东西)?
  • 重点是,在上面的例子中,我不想反复问用户“那些城市好吗?”,“他们还好吗?”和“哪一年?”。记住它应该在每次调用时使用相同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多