iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Stream性能测试实例分析
  • 116
分享到

Stream性能测试实例分析

2023-06-29 13:06:19 116人浏览 薄情痞子
摘要

本篇内容主要讲解“Stream性能测试实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Stream性能测试实例分析”吧!目录一、反馈问:stream比for循环慢5倍

本篇内容主要讲解“Stream性能测试实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Stream性能测试实例分析”吧!

目录

    一、反馈

    Stream性能测试实例分析

    问:stream比for循环慢5倍,用这个是为了啥? 答:互联网是一个新闻泛滥的时代,三人成虎,以假乱真的事情时候发生。作为一个技术开发者,要自己去动手去做,不要人云亦云。

    的确,这位粉丝说的这篇文章我也看过,我就不贴地址了,也没必要给他带流量。怎么说呢?就是一个不懂得测试的、不入流开发工程师做的性能测试,给出了一个危言耸听的结论。

    二、所有性能测试结论都是片面的

    性能测试是必要的,但针对性能测试的结果,永远要持怀疑态度。为什么这么说?

    性能测试脱离业务场景就是片面的性能测试。你能覆盖所有的业务场景么?性能测试脱离硬件环境就是片面的性能测试。你能覆盖所有的硬件环境么?性能测试脱离开发人员的知识面就是片面的性能测试。你能覆盖各种开发人员奇奇怪怪的代码么?

    所以,我从来不相信网上的任何性能测试的文章。凡是我自己的从事的业务场景,我都要在接近生产环境的机器上自己测试一遍。 所有性能测试结论都是片面的,只有你生产环境下的运行结果才是真的。

    三、动手测试Stream的性能

    3.1.环境

    windows10 、16G内存、i7-7700HQ 2.8HZ 、64位操作系统jdk 1.8.0_171

    3.2.测试用例与测试结论

    我们在上一节,已经讲过:

    针对不同的数据结构,Stream流的执行效率是不一样的针对不同的数据源,Stream流的执行效率也是不一样的

    所以记住笔者的话:所有性能测试结论都是片面的,你要自己动手做,相信你自己的代码和你的环境下的测试!我的测试结果仅仅代表我自己的测试用例和测试数据结构!

    3.2.1.测试用例一

    测试用例:5亿个int随机数,求最小值 测试结论(测试代码见后文):

    使用普通for循环,执行效率是Stream串行流的2倍。也就是说普通for循环性能更好。Stream并行流计算是普通for循环执行效率的4-5倍。Stream并行流计算 > 普通for循环 > Stream串行流计算

    Stream性能测试实例分析

    3.2.测试用例二

    测试用例:长度为10的1000000随机字符串,求最小值 测试结论(测试代码见后文):

    普通for循环执行效率与Stream串行流不相上下Stream并行流的执行效率远高于普通for循环Stream并行流计算 > 普通for循环 = Stream串行流计算

    Stream性能测试实例分析

    3.3.测试用例三

    测试用例:10个用户,每人200个订单。按用户统计订单的总价。 测试结论(测试代码见后文):

    Stream并行流的执行效率远高于普通for循环Stream串行流的执行效率大于等于普通for循环Stream并行流计算 > Stream串行流计算 >= 普通for循环 Stream性能测试实例分析

    四、最终测试结论 对于简单的数字(list-Int)遍历,普通for循环效率的确比Stream串行流执行效率高(1.5-2.5倍)。但是Stream流可以利用并行执行的方式发挥CPU的多核优势,因此并行流计算执行效率高于for循环。对于list-Object类型的数据遍历,普通for循环和Stream串行流比也没有任何优势可言,更不用提Stream并行流计算。

    虽然在不同的场景、不同的数据结构、不同的硬件环境下。Stream流与for循环性能测试结果差异较大,甚至发生逆转。但是总体上而言:

    Stream并行流计算 >> 普通for循环 ~= Stream串行流计算 (之所以用两个大于号,你细品)数据容量越大,Stream流的执行效率越高。Stream并行流计算通常能够比较好的利用CPU的多核优势。CPU核心越多,Stream并行流计算效率越高。

    stream比for循环慢5倍&#xff1f;也许吧&#xff0c;单核CPU、串行Stream的int类型数据遍历&#xff1f;我没试过这种场景&#xff0c;但是我知道这不是应用系统的核心场景。看了十几篇测试博文&#xff0c;和我的测试结果。我的结论是&#xff1a; 在大多数的核心业务场景下及常用数据结构下&#xff0c;Stream的执行效率比for循环更高。 毕竟我们的业务中通常是实实在在的实体对象&#xff0c;没事谁总对List<Int>类型进行遍历&#xff1f;谁的生产服务器是单核&#xff1f;。

    五、测试代码
    <dependency>    <groupId>com.GitHub.houbb</groupId>    <artifactId>junitperf</artifactId>    <version>2.0.0</version></dependency>

    测试用例一&#xff1a;

    import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;import com.github.houbb.junitperf.core.report.impl.htmlReporter;import org.junit.jupiter.api.BeforeAll;import java.util.Arrays;import java.util.Random;public class StreamIntTest {    public static int[] arr;    @BeforeAll    public static void init() {        arr = new int[500000000];  //5亿个随机Int        randomInt(arr);    }    @JunitPerfConfig( warmUp = 1000, reporter = {HtmlReporter.class})    public void testIntFor() {        minIntFor(arr);    }    @JunitPerfConfig( warmUp = 1000, reporter = {HtmlReporter.class})    public void testIntParallelStream() {        minIntParallelStream(arr);    }    @JunitPerfConfig( warmUp = 1000, reporter = {HtmlReporter.class})    public void testIntStream() {        minIntStream(arr);    }    private int minIntStream(int[] arr) {        return Arrays.stream(arr).min().getAsInt();    }    private int minIntParallelStream(int[] arr) {        return Arrays.stream(arr).parallel().min().getAsInt();    }    private int minIntFor(int[] arr) {        int min = Integer.MAX_VALUE;        for (int anArr : arr) {            if (anArr < min) {                min = anArr;            }        }        return min;    }    private static void randomInt(int[] arr) {        Random r = new Random();        for (int i = 0; i < arr.length; i++) {            arr[i] = r.nextInt();        }    }}

    测试用例二&#xff1a;

    import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;import com.github.houbb.junitperf.core.report.impl.HtmlReporter;import org.junit.jupiter.api.BeforeAll;import java.util.ArrayList;import java.util.Random;public class StreamStringTest {    public static ArrayList<String> list;    @BeforeAll    public static void init() {        list = randomStringList(1000000);    }    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})    public void testMinStringForLoop(){        String minStr = null;        boolean first = true;        for(String str : list){            if(first){                first = false;                minStr = str;            }            if(minStr.compareTo(str)>0){                minStr = str;            }        }    }    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})    public void textMinStringStream(){        list.stream().min(String::compareTo).get();    }    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})    public void testMinStringParallelStream(){        list.stream().parallel().min(String::compareTo).get();    }    private static ArrayList<String> randomStringList(int listLength){        ArrayList<String> list = new ArrayList<>(listLength);        Random rand = new Random();        int strLength = 10;        StringBuilder buf = new StringBuilder(strLength);        for(int i=0; i<listLength; i++){            buf.delete(0, buf.length());            for(int j=0; j<strLength; j++){                buf.append((char)('a'+ rand.nextInt(26)));            }            list.add(buf.toString());        }        return list;    }}

    测试用例三&#xff1a;

    import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;import com.github.houbb.junitperf.core.report.impl.HtmlReporter;import org.junit.jupiter.api.BeforeAll;import java.util.*;import java.util.stream.Collectors;public class StreamObjectTest {    public static List<Order> orders;    @BeforeAll    public static void init() {        orders = Order.genOrders(10);    }    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})    public void testSumOrderForLoop(){        Map<String, Double> map = new HashMap<>();        for(Order od : orders){            String userName = od.getUserName();            Double v;             if((v=map.get(userName)) != null){                map.put(userName, v+od.getPrice());            }else{                map.put(userName, od.getPrice());            }        }    }    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})    public void testSumOrderStream(){        orders.stream().collect(                Collectors.groupingBy(Order::getUserName,                         Collectors.summingDouble(Order::getPrice)));    }    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})    public void testSumOrderParallelStream(){        orders.parallelStream().collect(                Collectors.groupingBy(Order::getUserName,                         Collectors.summingDouble(Order::getPrice)));    }}class Order{    private String userName;    private double price;    private long timestamp;    public Order(String userName, double price, long timestamp) {        this.userName = userName;        this.price = price;        this.timestamp = timestamp;    }    public String getUserName() {        return userName;    }    public double getPrice() {        return price;    }    public long getTimestamp() {        return timestamp;    }    public static List<Order> genOrders(int listLength){        ArrayList<Order> list = new ArrayList<>(listLength);        Random rand = new Random();        int users = listLength/200;// 200 orders per user        users = users==0 ? listLength : users;        ArrayList<String> userNames = new ArrayList<>(users);        for(int i=0; i<users; i++){            userNames.add(UUID.randomUUID().toString());        }        for(int i=0; i<listLength; i++){            double price = rand.nextInt(1000);            String userName = userNames.get(rand.nextInt(users));            list.add(new Order(userName, price, System.nanoTime()));        }        return list;    }    @Override    public String toString(){        return userName + "::" + price;    }}

    到此,相信大家对“Stream性能测试实例分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: Stream性能测试实例分析

    本文链接: https://www.lsjlt.com/news/324904.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • c#程序自启动怎么设置
      c# 程序的自启动方法有三种:注册表:在指定注册表项下创建新值,并将其设置为程序可执行文件路径。任务计划程序:创建一个新任务,并在触发器和动作部分分别指定登录时或特定时间触发,以及启动程...
      99+
      2024-05-14
      c#
    • c#怎么调用dll文件
      可在 c# 中轻松调用 dll 文件:引用 dll(使用 dllimport 特性)定义与 dll 函数签名匹配的函数原型调用 dll 函数(如同 c# 函数)附加技巧:使用 chars...
      99+
      2024-05-14
      c#
    • 如何构建 Golang RESTful API,并实现 CRUD 操作?
      通过创建 golang 项目并安装必要的包,我们可以构建一个功能齐全的 restful api。它使用 mysql 数据库进行 crud 操作:1. 创建和连接数据库;2. 定义数据结构...
      99+
      2024-05-14
      go crud mysql git golang
    • c#怎么添加类文件
      在c#中添加类文件的步骤:1. 创建新项目,2. 添加新类,3. 为类添加代码,4. 在另一个类中引用新类。using语句引用类文件所在的命名空间;new运算符创建类的新实例;点运算符访...
      99+
      2024-05-14
      c#
    • 使用 C++ 构建高性能服务器架构的最佳实践
      遵循 c++++ 中构建高性能服务器架构的最佳实践可以创建可扩展、可靠且可维护的系统:使用线程池以重用线程,提高性能。利用协程减少上下文切换和内存开销,提升性能。通过智能指针和引用计数优...
      99+
      2024-05-14
      c++ 高性能服务器架构 数据访问
    • c#怎么添加字段
      在 c# 中添加字段包括以下步骤:声明字段:在类或结构中使用 字段类型 字段名; 语法声明字段。访问修饰符:用于限制对字段的访问,如 private、public、protected 和...
      99+
      2024-05-14
      c#
    • c#中怎么添加引用
      c# 中添加引用的方法有四种:使用 nuget 包管理器添加软件包。添加项目引用以包含其他项目。手动编辑项目文件 (.csproj) 以添加引用。从编译器命令行使用 /reference...
      99+
      2024-05-14
      c#
    • c#怎么创建文本文件
      在 c# 中创建文本文件的方法包括:创建 filestream 对象以打开或创建文件。使用 streamwriter 写入文本至文件。关闭 streamwriter 对象释放资源。关闭 ...
      99+
      2024-05-14
      c#
    • c#怎么定义属性
      如何在 c# 中定义属性 属性是一种编程构造,它包含一个 get 访问器和一个 set 访问器,允许以一种类属性的方式访问字段。它们提供了一种安全且封装的方式来访问和修改类的内部数据。 ...
      99+
      2024-05-14
      c#
    • 基于 C++ 的服务器架构的安全性考虑因素
      在设计基于 c++++ 的服务器架构时,安全考虑至关重要:使用 std::string 或 std::vector 避免缓冲区溢出。使用正则表达式或库函数验证用户输入。采用输出转义防止跨...
      99+
      2024-05-14
      安全性 关键词: c++ 服务器架构 c++ lsp
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作