1孽江、并行與并發(fā)的區(qū)別
在說到并行的時(shí)候岗屏,相信很多人都會(huì)想到并發(fā)的概念漱办。那么并行和并發(fā)兩者一字之差,有什么區(qū)別呢暇屋?
并行:多個(gè)任務(wù)在同一時(shí)間點(diǎn)發(fā)生洞辣,并由不同的cpu進(jìn)行處理扬霜,不互相搶占資源
并行:
并發(fā):多個(gè)任務(wù)在同一時(shí)間點(diǎn)內(nèi)同時(shí)發(fā)生了著瓶,但由同一個(gè)cpu進(jìn)行處理,互相搶占資源
并發(fā):
當(dāng)在大量數(shù)據(jù)處理上,數(shù)據(jù)并行化可以大量縮短任務(wù)的執(zhí)行時(shí)間华糖,將一個(gè)數(shù)據(jù)分解成多個(gè)部分瘟裸,然后并行處理,最 后將多個(gè)結(jié)果匯總兼搏,得到最終結(jié)果。
2裳朋、并行流原理介紹
對(duì)于并行流吓著,其在底層實(shí)現(xiàn)中,是沿用了Java7提供的fork/join分解合并框架進(jìn)行實(shí)現(xiàn)暖眼。fork根據(jù)cpu核數(shù)進(jìn)行數(shù) 據(jù)分塊纺裁,join對(duì)各個(gè)fork進(jìn)行合并欺缘。實(shí)現(xiàn)過程如下所示:
3浪南、影響并行流性能主要存在5個(gè)因素
對(duì)于并行流,一定不要陷入一個(gè)誤區(qū):并行一定比串行快骡送。并行在不同的情況下它不一定是比串行快的絮记。影響并行 流性能主要存在5個(gè)因素:
1)數(shù)據(jù)大小:輸入數(shù)據(jù)的大小派敷,直接影響了并行處理的性能撰洗。因?yàn)樵诓⑿袃?nèi)部實(shí)現(xiàn)中涉及到了fork/join操作差导,它 本身就存在性能上的開銷试躏。因此只有當(dāng)數(shù)據(jù)量很大,使用并行處理才有意義设褐。
2)源數(shù)據(jù)結(jié)構(gòu):fork時(shí)會(huì)對(duì)源數(shù)據(jù)進(jìn)行分割颠蕴,數(shù)據(jù)源的特性直接影響了fork的性能泣刹。 ArrayList、數(shù)組或IntStream.range犀被,可分解性最佳椅您,因?yàn)樗麄兌贾С蛛S機(jī)讀取,因此可以被任意分割寡键。 HashSet掀泳、TreeSet,可分解性一般昌腰,其雖然可被分解,但因?yàn)槠鋬?nèi)部數(shù)據(jù)結(jié)構(gòu)遭商,很難被平均分解固灵。 LinkedList、Streams.iterate劫流、BufferedReader.lines巫玻,可分解性極差,因?yàn)樗麄冮L(zhǎng)度未知祠汇,無法確定在哪里進(jìn)行 分割仍秤。
3)裝箱拆箱 盡量使用基本數(shù)據(jù)類型,避免裝箱拆箱可很。
4)CPU核數(shù) fork的產(chǎn)生數(shù)量是與可用CPU核數(shù)相關(guān)诗力,可用的核數(shù)越多,獲取的性能提升就會(huì)越大我抠。
5)單元處理開銷 花在流中每個(gè)元素的時(shí)間越長(zhǎng)苇本,并行操作帶來的性能提升就會(huì)越明顯。
4菜拓、測(cè)試總結(jié)
1)基本類型
性能消耗: Stream串行>for循環(huán)>Stream并行
2)對(duì)象
性能消耗:Stream串行>for循環(huán)>Stream并行
3)復(fù)雜對(duì)象
性能消耗:for循環(huán)>Stream串行>Stream并行
結(jié)論:對(duì)于簡(jiǎn)單操作瓣窄,如果環(huán)境機(jī)是多核的話,建議使用Stream并行纳鼎,同時(shí)在不考慮核數(shù)的情況 下俺夕,普通for循環(huán)性能要明顯高于Stream串行,相差兩倍左右贱鄙。 對(duì)于復(fù)雜操作劝贸,推薦使用Stream API操作。