併發程式設計: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程式設計
- Java 併發程式設計 Executor 框架Java程式設計框架
- 第03講:Flink 的程式設計模型與其他框架比較程式設計模型框架
- Laravel 和 Spring Boot 兩個框架比較創業篇(一:開發效率)LaravelSpring Boot框架創業
- 併發模型比較模型
- 《java併發程式設計的藝術》Executor框架Java程式設計框架
- Stream.toList()和Collectors.toList()的效能比較
- ForkJoin框架框架
- ForkJoin框架的RecursiveTask和ForkJoinPool的使用案例框架
- Java併發程式設計——synchronize 和 ReentrantLockJava程式設計ReentrantLock
- 併發程式設計之Wait和Notify程式設計AI
- 好程式設計師技術解析Hadoop和spark的效能比較程式設計師HadoopSpark
- 併發程式設計程式設計
- Python併發程式設計:提高網頁抓取效率實踐指南Python程式設計網頁
- 比較Java與Node.js的併發性和效能- maxantJavaNode.js
- Boost.Asio和ACE之間關於Socket程式設計的比較程式設計
- 硬體程式設計師和軟體開發程式設計師相比,哪一個就業發展前景比較好呢?程式設計師就業
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- Java併發程式設計的藝術,解讀併發程式設計的優缺點Java程式設計
- Java併發程式設計---java規範與模式下的併發程式設計1.1Java程式設計模式
- java 併發程式設計Java程式設計
- 併發程式設計—— LinkedTransferQueue程式設計
- 併發程式設計(ReentrantLock)程式設計ReentrantLock
- Go 併發程式設計Go程式設計
- golang併發程式設計Golang程式設計
- Golang 併發程式設計Golang程式設計
- Python併發程式設計Python程式設計
- 併發程式設計 synchronized程式設計synchronized
- 併發程式設計(四)程式設計
- 併發程式設計(二)程式設計
- Java併發程式設計Java程式設計
- 併發程式設計13程式設計
- .NET 中的併發程式設計程式設計
- Python_非同步程式設計-併發程式設計-協程和futurePython非同步程式設計
- Go 併發程式設計 - 併發安全(二)Go程式設計