性能
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、鏡湖ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的鏡湖網(wǎng)站制作公司
性能是在應(yīng)用中使用多線程的主要原因。但是,正如你看到的,如果你使用不當(dāng)?shù)脑?,你的?yīng)用會(huì)有很多問題。你的應(yīng)用會(huì)頻繁的崩潰,如果你不能控制多線程帶來的風(fēng)險(xiǎn),就像我之前提到的。更進(jìn)一步的,有些函數(shù)不能工作,因?yàn)橛行┚€程會(huì)阻塞或永遠(yuǎn)等待。因此如果你的應(yīng)用使用了多線程,你必須在擔(dān)心性能之前確保你的應(yīng)用正確運(yùn)行。
根據(jù)前面提到的這些問題,如果你的應(yīng)用需要使用多線程來加速運(yùn)行的話,你應(yīng)該深思熟慮。為了決定一個(gè)計(jì)算是否需要工作在多個(gè)單獨(dú)的線程上,你需要問問自己你的計(jì)算是cpu密集型還是io密集型的任務(wù)。
一個(gè)cpu密集型的任務(wù)是指大部分的時(shí)間都是在cpu上工作,保存cpu忙碌。下面的這些例子就是cpu密集型的任務(wù):
復(fù)雜的算法,例如當(dāng)計(jì)算一個(gè)有些的邏輯時(shí)對(duì)兩個(gè)數(shù)組進(jìn)行合并。
為一個(gè)給定的字符串在內(nèi)存(已經(jīng)加載和存儲(chǔ)在內(nèi)存中)中掃描一個(gè)大的字符串。
IO密集型就是大部分的時(shí)間都是在等待其他資源的數(shù)據(jù)。例如,你需要從文件或遠(yuǎn)程服務(wù)器上讀和加載圖片,你的線程大部分時(shí)間無事可干,只能等待遠(yuǎn)程服務(wù)器的數(shù)據(jù)。這些任務(wù)稱為IO任務(wù),他們需要在單獨(dú)的線程中調(diào)用。
為什么你不應(yīng)該把一個(gè)cpu密集型任務(wù)分割到很多線程中去執(zhí)行?它能幫助你計(jì)算更快嗎?圖6-12解釋的更詳細(xì)。
在圖6-12中你可以看到,當(dāng)一個(gè)cpu需要從一個(gè)線程切換到另一個(gè)線程的時(shí)候,要花費(fèi)時(shí)間和資源。因此,這對(duì)于任何應(yīng)用來說都是一個(gè)額外的消耗。如果你的任務(wù)只是一個(gè)cpu密集型的,完成整個(gè)任務(wù)可能會(huì)花費(fèi)cpu更多的時(shí)間,因?yàn)槿蝿?wù)的數(shù)量想一樣的,但是cpu需要處理額外的消耗。但是,如果將來iPhone有額外的cpu內(nèi)核的話,把任務(wù)分離出去是有意義的。
在IO任務(wù)中,情況是不同的。如果cpu沒有切換到其他線程,它只是在那里等待數(shù)據(jù),什么也不做。因此,在IO任務(wù)中,你應(yīng)該總是把它放在另一個(gè)線程中,這樣cpu就可以做其他事情,而不只是等待數(shù)據(jù)。
換句話說,想象一下超市。你的任務(wù)是服務(wù)所有顧客。這里有兩個(gè)場(chǎng)景來幫助解釋這兩個(gè)概念:
如果所有的顧客都是一樣的,他們頻繁的到來,你可以選擇把他們放在很多相同的收銀線上或者把他們放在同一隊(duì)列中。如果你把顧客放在很多的收銀線中,但是你只有一個(gè)收銀員,他需要從一個(gè)柜臺(tái)頻繁的到另一個(gè)柜臺(tái)來服務(wù)所有顧客。但是,如果你讓他們?cè)谕粋€(gè)隊(duì)列中,那么這個(gè)收銀員就不需要移動(dòng)。這就是cpu密集型任務(wù)。
但是,不同的情況是,如果你有很多不同類型的顧客,他們也不是頻繁的到來。例如,你可以有一個(gè)顧客服務(wù)臺(tái),一個(gè)自助收銀區(qū)域,一個(gè)收銀線區(qū)域。現(xiàn)在,如果顧客不是頻繁的來,你的收銀員將不得不在那里站著等待,什么也做不了?;蛘咚梢灶l繁的從一個(gè)區(qū)域切換到另一個(gè)區(qū)域,在顧客服務(wù)臺(tái)回答問題,在自助收銀臺(tái)幫助其他人。你不需要雇傭3個(gè)收銀員,你不能把你的顧客放在同一個(gè)隊(duì)列。這類似于IO密集型任務(wù),你的數(shù)據(jù)不是相同的,也不是在一個(gè)隊(duì)列中頻繁的來到。
你同意需要考慮用戶的響應(yīng)性。如果你的cpu密集型計(jì)算要花很多時(shí)間來完成,整個(gè)UI將會(huì)阻塞,變得不靈敏。因此,如果是主線程(或UI線程),你需要把重量級(jí)計(jì)算的任務(wù),要么是cpu密集型,要么是IO密集型,從這個(gè)線程中移除出去。
當(dāng)你設(shè)計(jì)多線程應(yīng)用時(shí),還有一些其他的問題你需要注意??聪旅娴拇a,看下你能否發(fā)現(xiàn)其中的問題:
你可能看到或沒有看到,問題出現(xiàn)在@synchronized(self);這行。你正在進(jìn)行多線程操作時(shí),你阻塞了,在同一時(shí)刻,只有一個(gè)線程能夠訪問那段代碼。那么這種情況使用多線程的好處是?因此,你必須小心的使用鎖。在做多線程時(shí),需要確保你的IO密集型任務(wù)不要長時(shí)間等待或阻塞一個(gè)線程。如果你線程使用不當(dāng),所有線程在啟動(dòng)任務(wù)之前,他們?nèi)匀恍枰嗷サ却?/p>
網(wǎng)站題目:iOS使用多線程提高數(shù)據(jù)并發(fā)訪問之八
網(wǎng)站路徑:http://weahome.cn/article/gicdhj.html