GCD介紹(二): 多核心的性能

概念

為了在單一進程中充分發(fā)揮多核的優(yōu)勢吠撮,我們有必要使用多線程技術(我們沒必要去提多進程,這玩意兒和GCD沒關系)。在低層驻谆,GCD全局dispatch queue僅僅是工作線程池的抽象。這些隊列中的Block一旦可用,就會被dispatch到工作線程中胜臊。提交至用戶隊列的Block最終也會通過全局隊列進入相同的工作線程池(除非你的用戶隊列的目標是主線程勺卢,但是為了提高運行速度,我們絕不會這么干)象对。

有兩種途徑來通過GCD“榨取”多核心系統(tǒng)的性能:將單一任務或者一組相關任務并發(fā)至全局隊列中運算黑忱;將多個不相關的任務或者關聯(lián)不緊密的任務并發(fā)至用戶隊列中運算;

全局隊列

設想下面的循環(huán):

for(id obj in array)

[self doSomethingIntensiveWith:obj];

假定-doSomethingIntensiveWith:是線程安全的且可以同時執(zhí)行多個.一個array通常包含多個元素织盼,這樣的話杨何,我們可以很簡單地使用GCD來平行運算:

dispatch_queue_t

queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,

0);

for(idobj

in array)

dispatch_async(queue,

^{

[selfdoSomethingIntensiveWith:obj];

});

如此簡單,我們已經(jīng)在多核心上運行這段代碼了沥邻。

當然這段代碼并不完美危虱。有時候我們有一段代碼要像這樣操作一個數(shù)組,但是在操作完成后唐全,我們還需要對操作結果進行其他操作:

for(id obj in array)

[self doSomethingIntensiveWith:obj];

[self doSomethingWith:array];

這時候使用GCD的dispatch_async就悲劇了.我們還不能簡單地使用dispatch_sync來解決這個問題, 因為這將導致每個迭代器阻塞埃跷,就完全破壞了平行計算。

解決這個問題的一種方法是使用dispatch group邮利。一個dispatch group可以用來將多個block組成一組以監(jiān)測這些Block全部完成或者等待全部完成時發(fā)出的消息弥雹。使用函數(shù)dispatch_group_create來創(chuàng)建,然后使用函數(shù)dispatch_group_async來將block提交至一個dispatch queue延届,同時將它們添加至一個組剪勿。所以我們現(xiàn)在可以重新編碼:

dispatch_queue_t

queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT,

0);

dispatch_group_t

group = dispatch_group_create();

for(idobj

in array)

dispatch_group_async(group,

queue, ^{

[selfdoSomethingIntensiveWith:obj];

});

dispatch_group_wait(group,

DISPATCH_TIME_FOREVER);

dispatch_release(group);

[self doSomethingWith:array];

如果這些工作可以異步執(zhí)行,那么我們可以更風騷一點方庭,將函數(shù)-doSomethingWith:放在后臺執(zhí)行厕吉。我們使用dispatch_group_async函數(shù)建立一個block在組完成后執(zhí)行:

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市械念,隨后出現(xiàn)的幾起案子头朱,更是在濱河造成了極大的恐慌,老刑警劉巖龄减,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件项钮,死亡現(xiàn)場離奇詭異,居然都是意外死亡希停,警方通過查閱死者的電腦和手機烁巫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宠能,“玉大人亚隙,你說我怎么就攤上這事」髋耍” “怎么了恃鞋?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵崖媚,是天一觀的道長。 經(jīng)常有香客問我恤浪,道長畅哑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任水由,我火速辦了婚禮荠呐,結果婚禮上,老公的妹妹穿的比我還像新娘砂客。我一直安慰自己泥张,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布鞠值。 她就那樣靜靜地躺著媚创,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彤恶。 梳的紋絲不亂的頭發(fā)上钞钙,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音声离,去河邊找鬼芒炼。 笑死,一個胖子當著我的面吹牛术徊,可吹牛的內(nèi)容都是我干的本刽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼赠涮,長吁一口氣:“原來是場噩夢啊……” “哼子寓!你這毒婦竟也來了?” 一聲冷哼從身側響起世囊,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤别瞭,失蹤者是張志新(化名)和其女友劉穎窿祥,沒想到半個月后株憾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡晒衩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年嗤瞎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片听系。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡贝奇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靠胜,到底是詐尸還是另有隱情掉瞳,我是刑警寧澤毕源,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站陕习,受9級特大地震影響霎褐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜该镣,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一冻璃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧损合,春花似錦省艳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至律适,卻和暖如春枣购,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擦耀。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工棉圈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眷蜓。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓分瘾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吁系。 傳聞我的和親對象是個殘疾皇子德召,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容