java8中parallelStream性能测试及结果分析
作者:laozhang 时间:2021-09-26 15:46:43
测试1
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 3, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 20, time = 3, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@State(Scope.Benchmark)
public class StreamBenchTest {
List<String> data = new ArrayList<>();
@Setup
public void init() {
// prepare
for(int i=0;i<100;i++){
data.add(UUID.randomUUID().toString());
}
}
@TearDown
public void destory() {
// destory
}
@Benchmark
public void benchStream(){
data.stream().forEach(e -> {
e.getBytes();
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
});
}
@Benchmark
public void benchParallelStream(){
data.parallelStream().forEach(e -> {
e.getBytes();
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
});
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(".*" +StreamBenchTest.class.getSimpleName()+ ".*")
.forks(1)
.build();
new Runner(opt).run();
}
}
parallelStream线程数
默认是Runtime.getRuntime().availableProcessors() - 1,这里为7
运行结果
# Run complete. Total time: 00:02:44
Benchmark Mode Cnt Score Error Units
StreamBenchTest.benchParallelStream avgt 20 155868805.437 ± 1509175.840 ns/op
StreamBenchTest.benchStream avgt 20 1147570372.950 ± 6138494.414 ns/op
测试2
将数据data改为30,同时sleep改为100
Benchmark Mode Cnt Score Error Units
StreamBenchTest.benchParallelStream avgt 20 414230854.631 ± 725294.455 ns/op
StreamBenchTest.benchStream avgt 20 3107250608.500 ± 4805037.628 ns/op
可以发现sleep越长,parallelStream优势越明显。
小结
parallelStream在阻塞场景下优势更明显,其线程池个数默认为
Runtime.getRuntime().availableProcessors() - 1,如果需修改则需设置-Djava.util.concurrent.ForkJoinPool.common.parallelism=8
来源:https://segmentfault.com/a/1190000012755594
标签:java8,parallelStream,性能测试
0
投稿
猜你喜欢
Redis 订阅发布_Jedis实现方法
2023-11-10 03:38:41
SprinBoot整合Quart实现定时调度的示例代码
2021-12-07 21:30:59
Android使用SlidingPaneLayout 实现仿微信的滑动返回
2023-08-29 04:48:21
Java利用Sping框架编写RPC远程过程调用服务的教程
2022-08-14 01:59:40
深入解析C++编程中对设计模式中的策略模式的运用
2022-05-26 22:52:20
深入理解Java并发编程之ThreadLocal
2023-11-21 02:43:42
C#开发windows服务实现自动从FTP服务器下载文件
2022-08-26 04:11:41
Java Springboot的目的你知道吗
2022-12-20 14:16:24
SpringBoot Security前后端分离登录验证的实现
2023-03-09 10:30:07
修改idea的这些启动参数,令你的idea健步如飞
2021-11-14 14:48:11
C#中的char、string和StringBuilder的使用详解
2022-12-12 12:59:50
C#创建、部署、调用WebService图文实例详解
2022-05-03 06:35:20
详解JAVA中static的作用
2021-12-05 09:13:47
spring security动态配置url权限的2种实现方法
2021-06-25 15:31:12
Android开发 OpenGL ES绘制3D 图形实例详解
2023-01-12 00:06:09
Android控件实现水滴效果
2021-07-31 20:43:51
java在linux本地执行shell命令的实现方法
2023-11-14 02:31:33
java高并发ScheduledThreadPoolExecutor与Timer区别
2023-08-11 03:08:29
mybatis trim标签的使用详解
2022-07-10 23:27:54
SpringBoot中使用多线程的方法示例
2021-05-24 19:56:04