出于好奇,如果在java8样式中使用Comparator,即使用Lambda表达式比常规比较有任何优势,即。
一种按id排序的方法是:-
List sortedAcs = ac
.stream()
.sorted((a, b) -> Long.compare(a.getId(), b.getId())) //sorted by id here
.collect(Collectors.toList());
其他方法可以是Java 8 way:-
List sortedAcs = ac
.stream()
.sorted(Comparator.comparingLong(AC::getId)) //sorted by id here
.collect(Collectors.toList());
与前一种方法相比,后一种方法(< code>java-8方法参考)是否有性能优势?
请帮忙!!!
因此,从一个角度(即性能)得出答案。
这是我用来测试它的代码:-
AC类:-
package com.test;
public class AC {
private Long id;
public AC(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String toString() {
return "AC{" +
"id=" + id +
'}';
}
}
主类:-
package test.java;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
@org.openjdk.jmh.annotations.Benchmark
public void measureName() {
List<AC> acs = new ArrayList<>();
acs.add(new AC(20l));
acs.add(new AC(30l));
acs.add(new AC(10l));
acs.add(new AC(30l));
acs.add(new AC(80l));
acs.add(new AC(50l));
acs.add(new AC(30l));
acs.add(new AC(90l));
acs.add(new AC(80l));
acs.add(new AC(110l));
/* acs
.stream()
.sorted(Comparator.comparingLong(AC::getId)) //sorted by id here
.collect(Collectors.toList());*/
acs.stream()
.sorted((a, b) -> Long.compare(a.getId(), b.getId())) //sorted by id here
.collect(Collectors.toList());
}
public static void main(String[] args) {
Options opt = new OptionsBuilder()
.include(".*" + Main.class.getSimpleName() + ".*")
.forks(1)
.build();
try {
new Runner(opt).run();
} catch (RunnerException e) {
e.printStackTrace();
}
}
}
使用< code > comparator . comparing long :的JMH输出如下
# Run complete. Total time: 00:00:40
Benchmark Mode Cnt Score Error Units
Main.measureName thrpt 20 4130836.283 ± 86675.431 ops/s
对于下面的Long.compare
:-
# Run complete. Total time: 00:00:40
Benchmark Mode Cnt Score Error Units
Main.measureName thrpt 20 4106542.318 ± 146956.814 ops/s
如果我按照这些统计< code>Long.compare不知何故要快一些,尽管差别很小。
如果有任何发现,请随时发表评论,我也会尝试。
两个代码片段中的任何性能差异都是可以忽略的。如果您真的需要优化该代码,那么不使用流可能会比更换该比较器带来更大的性能提升。
在两种变体之间进行选择的唯一标准是清晰度:您认为哪一个更清楚地传达了代码的意图?最后,这是个人喜好,具体取决于您对Java 8功能的熟练程度等。
就我个人而言,我发现第二个片段比第一个片段更清晰。比较龙
方法(和其他比较X
方法)立即告诉我:这里我们正在根据(Long
-type)属性的值比较对象。在第一个片段中,我首先需要解析代码以确定确实发生了这种情况。
唯一不同的是完成您想要的方法的数量。Comparator.comparingLong
将为每个参数应用ToLong函数
,然后委托给Long.compare
。但这是一个简单的优化,JIT
应该处理。我想说,由于这种差异,可能会有一点差异(直到JIT开始),但它太小了,绝对可以忽略,不应该以任何方式驱动您的决定。
另一方面,如果您确实看到任何差异,那么问题可能是您的测试代码,而不是正在测量的代码。
问题内容: 有人可以告诉我为什么对node.js如此大惊小怪吗?与用php框架编写的常规网站相比,用node.js编写的常规网站(比如博客)是否更快?我知道用node.js编写的Web服务器将比apache快,但是不创建线程或类似对象的真实Web应用程序呢? 问题答案: 编辑: 有两个主要优点: 速度!(性能) Node.js是事件驱动和非阻塞的,并且非常擅长处理并发请求。 这是指向 Apache
问题内容: 用…实现事情 似乎 已经 很简单 了… 与 ngResource相比 ,使用Restangular 有哪些优点/缺点? 1.1.3 将返回承诺,并且可以使用[最新的PRcommit来实现。将来会提供支持来支持Restangular所做的其他动词吗?如果发生这种情况,Restangular似乎将消失并变得不耐烦。 问题答案: 我是Restangular的创建者。 我已经在自述文件中创建了
本文向大家介绍使用 Spring Cloud 有什么优势?相关面试题,主要包含被问及使用 Spring Cloud 有什么优势?时的应答技巧和注意事项,需要的朋友参考一下 使用 Spring Boot 开发分布式微服务时,我们面临以下问题 与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。 服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目
问题内容: 我从php中的普通mysql切换到PDO,我注意到测试错误的常用方法是使用try / catch组合,而不是if / else组合。 该方法的优点是,我可以使用一个try / catch块而不是几个嵌套的if / else块来处理不同步骤(连接,准备,执行等)的所有错误吗? 问题答案: 除非确实存在某些特殊情况,否则我应该使用try / catch块来遍历代码的正常路径而不会出错,除非
我对Spring框架相当陌生,所以我为这个愚蠢的问题道歉。我一直在学习Javabean;我也一直在阅读Spring框架是如何成为bean容器的,以及如何有不同类型的bean(使用JavaBeans的优势是什么?)。 然而,我仍然不明白他们为什么如此强大。如果我们想,比如说,创建一个Spring web应用程序,我们不能不使用bean,而只使用POJO吗?与POJO相比,使用Java bean的真正
我想每秒运行一个函数60次。我更喜欢使用Util定时器,我认为这是一个非常简单的方法 但是我看到很多人使用游戏循环,它们更长更复杂。 抱歉,因为我并不真正理解gameloops,除了跟踪fps之外,使用它们还有什么好处吗?