併發程式設計:DEMO:比較Stream和forkjoin框架的效率
目錄
一、主程式
package xyz.jangle.thread.test.nxi_13.streamvsforkjoin;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.Collectors;
/**
* 11.13、使用流處理大資料(比較Stream和forkjoin的效率)
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年11月30日 下午7:58:04
*
*/
public class M {
public static void main(String[] args) {
var ps = Person.generatorPersons(10000000);
// 使用流
var start = new Date();
ConcurrentMap<String, List<Person>> collect = ps.parallelStream()
.collect(Collectors.groupingByConcurrent(p -> p.getArea()));
var end = new Date();
System.out.println(collect.size() + ":Stream::Time:" + (end.getTime() - start.getTime()));
// 使用fork/join框架
start = new Date();
var forkjoinMap = new ConcurrentHashMap<String, ConcurrentLinkedDeque<Person>>();
var personMapTask = new PersonMapTask(ps, forkjoinMap);
ForkJoinPool.commonPool().invoke(personMapTask);
end = new Date();
System.out.println(forkjoinMap.size() + ":ForkJoinPool::Time:" + (end.getTime() - start.getTime()));
}
}
二、Person類
package xyz.jangle.thread.test.nxi_13.streamvsforkjoin;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Model
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年11月30日 下午7:30:02
*
*/
public class Person {
private String name;
private String area;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public static List<Person> generatorPersons(int size){
String[] names = {"A","B","C"};
String[] areas = {"北","上","深","杭"};
var persons = new ArrayList<Person>();
var random = new Random();
for (int i = 0; i < size; i++) {
var p = new Person();
p.setName(names[random.nextInt(names.length)]);
p.setArea(areas[random.nextInt(areas.length)]);
persons.add(p);
}
return persons;
}
}
三、forkjoin框架的任務
package xyz.jangle.thread.test.nxi_13.streamvsforkjoin;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.RecursiveAction;
/**
* forkjoin框架的任務
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年11月30日 下午7:39:42
*
*/
public class PersonMapTask extends RecursiveAction {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<Person> persons;
private ConcurrentHashMap<String, ConcurrentLinkedDeque<Person>> personMap;
public PersonMapTask(List<Person> persons, ConcurrentHashMap<String, ConcurrentLinkedDeque<Person>> personMap) {
super();
this.persons = persons;
this.personMap = personMap;
}
@Override
protected void compute() {
if (persons.size() < 1000) {
for (Person person : persons) {
ConcurrentLinkedDeque<Person> personList = personMap.computeIfAbsent(person.getArea(),
area -> new ConcurrentLinkedDeque<Person>());
personList.add(person);
}
return;
}
var t1 = new PersonMapTask(persons.subList(0, persons.size() / 2), personMap);
var t2 = new PersonMapTask(persons.subList(persons.size() / 2, persons.size()), personMap);
invokeAll(t1, t2);
}
}
四、執行結果
4:::Time:872
4:::Time:624
五、總結
兩個解決方案的效率相近,forkjoin框架略高於Stream。但是,Stream使用方便,可以節省開發時間。
相關文章
- Java併發程式設計ForkJoin的DemoJava程式設計
- 併發程式設計之:ForkJoin程式設計
- 《java併發程式設計的藝術》併發容器和框架Java程式設計框架
- Java、Rust、Go、NodeJS、TypeScript併發程式設計比較 - foojayJavaRustGoNodeJSTypeScript程式設計
- disruptor - 併發程式設計框架程式設計框架
- Java 併發程式設計 Executor 框架Java程式設計框架
- 併發模型比較模型
- 《java併發程式設計的藝術》Executor框架Java程式設計框架
- Laravel 和 Spring Boot 兩個框架比較創業篇(一:開發效率)LaravelSpring Boot框架創業
- 併發程式設計和並行程式設計程式設計並行行程
- ForkJoin框架框架
- 第03講:Flink 的程式設計模型與其他框架比較程式設計模型框架
- Web開發框架比較Web框架
- Oracle Stream(3)--Stream與高階複製和邏輯Dataguard的比較Oracle
- Java併發的四種風味:Thread、Executor、ForkJoin和ActorJavathread
- 併發程式設計程式設計
- ForkJoin框架的RecursiveTask和ForkJoinPool的使用案例框架
- 比較Java與Node.js的併發性和效能- maxantJavaNode.js
- 高階併發:Akka Actors和JavaEE7的EJB比較Java
- C++併發程式設計框架Theron(4)——Hello world!C++程式設計框架
- 【Java併發程式設計】併發程式設計大合集-值得收藏Java程式設計
- C++併發程式設計框架Theron(2)——Theron的五要素C++程式設計框架
- 使用Java 7.0的 Fork/Join框架進行併發程式設計Java框架程式設計
- 併發程式設計之Wait和Notify程式設計AI
- Java併發程式設計——synchronize 和 ReentrantLockJava程式設計ReentrantLock
- Java併發程式設計:CountDownLatch、CyclicBarrier和SemaphoreJava程式設計CountDownLatch
- Python併發程式設計:提高網頁抓取效率實踐指南Python程式設計網頁
- 併發程式設計的鎖機制:synchronized和lock程式設計synchronized
- Java併發程式設計的藝術,解讀併發程式設計的優缺點Java程式設計
- 硬體程式設計師和軟體開發程式設計師相比,哪一個就業發展前景比較好呢?程式設計師就業
- Go 併發程式設計 - 併發安全(二)Go程式設計
- Java併發程式設計---java規範與模式下的併發程式設計1.1Java程式設計模式
- Golang 併發程式設計Golang程式設計
- 併發程式設計(四)程式設計
- 併發程式設計(二)程式設計
- java 併發程式設計Java程式設計
- 併發程式設計13程式設計
- golang併發程式設計Golang程式設計