今天又翻了一下書的目錄,第一章在這之后就結(jié)束了。也就是說,這本書所涉及到的新的知識已經(jīng)全部點到了。
書的其余部分就是對這幾個概念做一些基礎(chǔ)知識的補充以及更深層次的實踐。
最后兩個小節(jié)的內(nèi)容較少,所以合成一篇文章來總結(jié)。
上一篇:Lambda&Java多核編程-0-從集合到流
從串行到并行
串行指一個步驟一個步驟地處理,也就是通常情況下,代碼一行一行地執(zhí)行。
如果將我們常用的迭代器式的循環(huán)展開的話,就是串行執(zhí)行了循環(huán)體內(nèi)所定義的操作:
sum += arr.get(0); sum += arr.get(1); sum += arr.get(2);//...
在書的一開始,就提到Java需要支持集合的并行計算(而Lambda為這個需求提供了可能)。
這些功能將全部被實現(xiàn)于庫代碼中,對于我們使用者,實現(xiàn)并行的復雜性被大大降低(最低程度上只需要調(diào)用相關(guān)方法)。
另外,關(guān)于并發(fā)與并行這兩個概念,其實是不同的,如果不明白的話請自行了解,在此只引用一句非常流行的話:
一個是關(guān)于代碼結(jié)構(gòu),一個是關(guān)于代碼執(zhí)行。
如果我們想將一個計算任務均勻地分配給CPU的四個內(nèi)核,我們會給每個核分配一個用于計算的線程,每個線程上進行整個任務的子任務。
書上有一段非常形象的偽代碼:
if the task list contains more than N/4 elements { leftTask = task.getLeftHalf() rightTask = task.getRightHalf() doInparallel { leftResult = leftTask.solve() rightResult = rightTask.solve() } result = combine(leftResult, rightResult) } else { result = task.solveSequentially() }
代碼中,將每四個任務元素分為一組,用四個內(nèi)核對其進行并行處理,然后每兩組進行一次結(jié)果的合并,最終得到整個任務隊列的最終結(jié)果。
從整體處理流程上看,先將任務隊列遞歸地進行分組,并行處理每一組,然后將結(jié)果遞歸地進行合并(合并通過管道終止操作實現(xiàn))。
Java8之前,開發(fā)者們使用一種針對集合的fork/join框架來實現(xiàn)該模式。
然而現(xiàn)在,想對代碼進行性能優(yōu)化,就是一件非常容易的事了。
還記得我們上一節(jié)中所得出的最終代碼:
long validContactCounter