当前位置: 首页 > 知识库问答 >
问题:

使用Comparator.comparingLong比long.compare有什么优势吗?

商茂勋
2023-03-14

出于好奇,如果在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方法参考)是否有性能优势?

请帮忙!!!

共有3个答案

谢志用
2023-03-14

因此,从一个角度(即性能)得出答案。

这是我用来测试它的代码:-

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不知何故要快一些,尽管差别很小。

如果有任何发现,请随时发表评论,我也会尝试。

储俊英
2023-03-14

两个代码片段中的任何性能差异都是可以忽略的。如果您真的需要优化该代码,那么不使用流可能会比更换该比较器带来更大的性能提升。

在两种变体之间进行选择的唯一标准是清晰度:您认为哪一个更清楚地传达了代码的意图?最后,这是个人喜好,具体取决于您对Java 8功能的熟练程度等。

就我个人而言,我发现第二个片段比第一个片段更清晰。比较龙方法(和其他比较X方法)立即告诉我:这里我们正在根据(Long-type)属性的值比较对象。在第一个片段中,我首先需要解析代码以确定确实发生了这种情况。

锺离烈
2023-03-14

唯一不同的是完成您想要的方法的数量。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之外,使用它们还有什么好处吗?