欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java8中parallelStream性能测试及结果分析

程序员文章站 2023-12-16 08:33:04
测试1 @benchmarkmode(mode.averagetime) @outputtimeunit(timeunit.nanoseconds) @war...

测试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

以上就是本次讲述知识点的全部内容,感谢你对的支持。

上一篇:

下一篇: