欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Go語(yǔ)言lru算法 go語(yǔ)言方法和函數(shù)

Go語(yǔ)言 排序與搜索切片

Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中提供了sort包對(duì)整型,浮點(diǎn)型,字符串型切片進(jìn)行排序,檢查一個(gè)切片是否排好序,使用二分法搜索函數(shù)在一個(gè)有序切片中搜索一個(gè)元素等功能。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到房山網(wǎng)站設(shè)計(jì)與房山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋房山地區(qū)。

關(guān)于sort包內(nèi)的函數(shù)說(shuō)明與使用,請(qǐng)查看

在這里簡(jiǎn)單講幾個(gè)sort包中常用的函數(shù)

在Go語(yǔ)言中,對(duì)字符串的排序都是按照字節(jié)排序,也就是說(shuō)在對(duì)字符串排序時(shí)是區(qū)分大小寫(xiě)的。

二分搜索算法

Go語(yǔ)言中提供了一個(gè)使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比較㏒?n個(gè)元素,其中n為切片中元素的總數(shù)。

sort.Search(size,fn)函數(shù)接受兩個(gè)參數(shù):所處理的切片的長(zhǎng)度和一個(gè)將目標(biāo)元素與有序切片的元素相比較的函數(shù),該函數(shù)是一個(gè)閉包,如果該有序切片是升序排列,那么在判斷時(shí)使用 有序切片的元素 = 目標(biāo)元素。該函數(shù)返回一個(gè)int值,表示與目標(biāo)元素相同的切片元素的索引。

在切片中查找出某個(gè)與目標(biāo)字符串相同的元素索引

有誰(shuí)能具體介紹下Android軟件的開(kāi)發(fā)周期特點(diǎn),其主流IDE工具,Go語(yǔ)言的優(yōu)缺點(diǎn)?(50分)

Android系統(tǒng)試圖盡可能長(zhǎng)地保持一個(gè)應(yīng)用程序進(jìn)程,但是當(dāng)內(nèi)存低時(shí)它最終還是需要移除舊的進(jìn)程。為了決定保持哪個(gè)進(jìn)程及殺死哪個(gè)進(jìn)程,Android將每個(gè)進(jìn)程放入一個(gè)基于運(yùn)行于其中的組件的重要性等級(jí)和這些組件的狀態(tài)。重要性最低的進(jìn)程首先被殺死,然后是次低,以此類(lèi)推??偣灿?個(gè)層次等級(jí)。下列清單按重要性順序列出:前臺(tái)進(jìn)程,用戶當(dāng)前工作所需要的。一個(gè)進(jìn)程如果滿足下列任何條件被認(rèn)為是前臺(tái)進(jìn)程:它正運(yùn)行著一個(gè)正在與用戶交互的活動(dòng)(Activity對(duì)象的onResume()方法已經(jīng)被調(diào)用)。它寄宿了一個(gè)服務(wù),該服務(wù)與一個(gè)與用戶交互的活動(dòng)綁定。它有一個(gè)Service對(duì)象執(zhí)行它的生命周期回調(diào)(onCreate()、onStart()、onDestroy())。它有一個(gè)BroadcastReceiver對(duì)象執(zhí)行他的onReceive()方法。

在給定時(shí)間內(nèi)僅有少數(shù)的前臺(tái)進(jìn)程存在。僅作為最后采取的措施他們才會(huì)被殺掉——如果內(nèi)存太低以至于他們不能繼續(xù)運(yùn)行。一般來(lái)說(shuō),就在那時(shí),設(shè)備達(dá)到一個(gè)內(nèi)存???狀態(tài),因此殺掉某些前臺(tái)進(jìn)程以保持用戶界面響應(yīng)??梢曔M(jìn)程,他沒(méi)有任何前臺(tái)組件,但是仍然能影響用戶在屏幕上看到東西。一個(gè)進(jìn)程滿足下面任何一個(gè)條件都被認(rèn)為是可視的:它寄宿著一個(gè)不是前臺(tái)的活動(dòng),但是它對(duì)用戶仍可見(jiàn)(它的onPause()方法已經(jīng)被調(diào)用)。舉例來(lái)說(shuō),這可能發(fā)送在,如果一個(gè)前臺(tái)活動(dòng)是一個(gè)對(duì)話框且運(yùn)行之前的活動(dòng)在其后面仍可視。它寄宿著一個(gè)服務(wù),該服務(wù)綁定到一個(gè)可視的活動(dòng)。

一個(gè)可視進(jìn)程被認(rèn)為是及其重要的且不會(huì)被殺死,除非為了保持前臺(tái)進(jìn)程運(yùn)行。服務(wù)進(jìn)程,是一個(gè)運(yùn)行著一個(gè)用startService()方法啟動(dòng)的服務(wù),并且該服務(wù)并沒(méi)有落入上面2種分類(lèi)。雖然服務(wù)進(jìn)程沒(méi)有直接關(guān)系到任何用戶可見(jiàn)的,它們通常做用戶關(guān)心的事(諸如在后臺(tái)播放mp3或者從網(wǎng)絡(luò)上下載數(shù)據(jù)),因此系統(tǒng)保持它們運(yùn)行,除非沒(méi)有足夠內(nèi)存隨著所有的前臺(tái)進(jìn)程和可視進(jìn)程保持它們。后臺(tái)進(jìn)程,是一個(gè)保持著一個(gè)當(dāng)前對(duì)用戶不可視的活動(dòng)(已經(jīng)調(diào)用Activity對(duì)象的onStop()方法)。這些進(jìn)程沒(méi)有直接影響用戶體驗(yàn),并且可以在任何時(shí)候被殺以收回內(nèi)存用于一個(gè)前臺(tái)、可視、服務(wù)進(jìn)程。一般地有很多后臺(tái)進(jìn)程運(yùn)行著,因此它們保持在一個(gè)LRU(least recently used,即最近最少使用,如果您學(xué)過(guò)操作系統(tǒng)的話會(huì)覺(jué)得它很熟悉,跟內(nèi)存的頁(yè)面置換算法LRU一樣。)列表以確保最近使用最多的活動(dòng)的進(jìn)程最后被殺。如果一個(gè)活動(dòng)執(zhí)行正確地執(zhí)行它的生命周期方法,且捕獲它當(dāng)前的狀態(tài),殺掉它對(duì)用戶的體驗(yàn)沒(méi)有有害的影響??者M(jìn)程,是一個(gè)沒(méi)有保持活躍的應(yīng)用程序組件的進(jìn)程。保持這個(gè)進(jìn)程可用的唯一原因是作為一個(gè)cache以提高下次啟動(dòng)組件的速度。系統(tǒng)進(jìn)程殺死這些進(jìn)程,以在進(jìn)程cache和潛在的內(nèi)核cache之間平衡整個(gè)系統(tǒng)資源。Android把進(jìn)程標(biāo)記為它可以的最高級(jí),即進(jìn)程中活躍的組件中重要性最高的那個(gè)(選取重要性最高的那個(gè)作為進(jìn)程的重要性級(jí)別)。例如,有一個(gè)進(jìn)程寄宿著一個(gè)服務(wù)和一個(gè)可視活動(dòng),進(jìn)程的級(jí)別被設(shè)置為可視進(jìn)程級(jí)別,而不是服務(wù)進(jìn)程級(jí)別(因?yàn)榭梢曔M(jìn)程級(jí)別比服務(wù)進(jìn)程級(jí)別高)。此外,一個(gè)進(jìn)程的排名因?yàn)槠渌M(jìn)程依賴(lài)它而上升。一個(gè)進(jìn)程服務(wù)其它進(jìn)程,它的排名從不會(huì)比它服務(wù)的進(jìn)程低。例如,進(jìn)程A中的一個(gè)內(nèi)容提供者服務(wù)進(jìn)程B中的一個(gè)客戶,或者進(jìn)程A中的一個(gè)服務(wù)綁定到進(jìn)程B中的一個(gè)組件,進(jìn)程A總是被認(rèn)為比進(jìn)程B重要。因?yàn)橐粋€(gè)運(yùn)行一個(gè)服務(wù)進(jìn)程排名比一個(gè)運(yùn)行后臺(tái)活動(dòng)的進(jìn)程排名高,一個(gè)活動(dòng)啟動(dòng)一個(gè)服務(wù)來(lái)初始化一個(gè)長(zhǎng)時(shí)間運(yùn)行操作,而不是簡(jiǎn)單地衍生一個(gè)線程——特別是如果操作很可能會(huì)拖垮活動(dòng)。這方面的例子是在后臺(tái)播放音樂(lè)和上傳相機(jī)拍攝的圖片到一個(gè)網(wǎng)站。使用服務(wù)保證操作至少有“服務(wù)進(jìn)程”的優(yōu)先級(jí),無(wú)論活動(dòng)發(fā)生什么情況。

golang sync.pool對(duì)象復(fù)用 并發(fā)原理 緩存池

在go http每一次go serve(l)都會(huì)構(gòu)建Request數(shù)據(jù)結(jié)構(gòu)。在大量數(shù)據(jù)請(qǐng)求或高并發(fā)的場(chǎng)景中,頻繁創(chuàng)建銷(xiāo)毀對(duì)象,會(huì)導(dǎo)致GC壓力。解決辦法之一就是使用對(duì)象復(fù)用技術(shù)。在http協(xié)議層之下,使用對(duì)象復(fù)用技術(shù)創(chuàng)建Request數(shù)據(jù)結(jié)構(gòu)。在http協(xié)議層之上,可以使用對(duì)象復(fù)用技術(shù)創(chuàng)建(w,*r,ctx)數(shù)據(jù)結(jié)構(gòu)。這樣即可以回快TCP層讀包之后的解析速度,也可也加快請(qǐng)求處理的速度。

先上一個(gè)測(cè)試:

結(jié)論是這樣的:

貌似使用池化,性能弱爆了???這似乎與net/http使用sync.pool池化Request來(lái)優(yōu)化性能的選擇相違背。這同時(shí)也說(shuō)明了一個(gè)問(wèn)題,好的東西,如果濫用反而造成了性能成倍的下降。在看過(guò)pool原理之后,結(jié)合實(shí)例,將給出正確的使用方法,并給出預(yù)期的效果。

sync.Pool是一個(gè) 協(xié)程安全 的 臨時(shí)對(duì)象池 。數(shù)據(jù)結(jié)構(gòu)如下:

local 成員的真實(shí)類(lèi)型是一個(gè) poolLocal 數(shù)組,localSize 是數(shù)組長(zhǎng)度。這涉及到Pool實(shí)現(xiàn),pool為每個(gè)P分配了一個(gè)對(duì)象,P數(shù)量設(shè)置為runtime.GOMAXPROCS(0)。在并發(fā)讀寫(xiě)時(shí),goroutine綁定的P有對(duì)象,先用自己的,沒(méi)有去偷其它P的。go語(yǔ)言將數(shù)據(jù)分散在了各個(gè)真正運(yùn)行的P中,降低了鎖競(jìng)爭(zhēng),提高了并發(fā)能力。

不要習(xí)慣性地誤認(rèn)為New是一個(gè)關(guān)鍵字,這里的New是Pool的一個(gè)字段,也是一個(gè)閉包名稱(chēng)。其API:

如果不指定New字段,對(duì)象池為空時(shí)會(huì)返回nil,而不是一個(gè)新構(gòu)建的對(duì)象。Get()到的對(duì)象是隨機(jī)的。

原生sync.Pool的問(wèn)題是,Pool中的對(duì)象會(huì)被GC清理掉,這使得sync.Pool只適合做簡(jiǎn)單地對(duì)象池,不適合作連接池。

pool創(chuàng)建時(shí)不能指定大小,沒(méi)有數(shù)量限制。pool中對(duì)象會(huì)被GC清掉,只存在于兩次GC之間。實(shí)現(xiàn)是pool的init方法注冊(cè)了一個(gè)poolCleanup()函數(shù),這個(gè)方法在GC之前執(zhí)行,清空pool中的所有緩存對(duì)象。

為使多協(xié)程使用同一個(gè)POOL。最基本的想法就是每個(gè)協(xié)程,加鎖去操作共享的POOL,這顯然是低效的。而進(jìn)一步改進(jìn),類(lèi)似于ConcurrentHashMap(JDK7)的分Segment,提高其并發(fā)性可以一定程度性緩解。

注意到pool中的對(duì)象是無(wú)差異性的,加鎖或者分段加鎖都不是較好的做法。go的做法是為每一個(gè)綁定協(xié)程的P都分配一個(gè)子池。每個(gè)子池又分為私有池和共享列表。共享列表是分別存放在各個(gè)P之上的共享區(qū)域,而不是各個(gè)P共享的一塊內(nèi)存。協(xié)程拿自己P里的子池對(duì)象不需要加鎖,拿共享列表中的就需要加鎖了。

Get對(duì)象過(guò)程:

Put過(guò)程:

如何解決Get最壞情況遍歷所有P才獲取得對(duì)象呢:

方法1止前sync.pool并沒(méi)有這樣的設(shè)置。方法2由于goroutine被分配到哪個(gè)P由調(diào)度器調(diào)度不可控,無(wú)法確保其平衡。

由于不可控的GC導(dǎo)致生命周期過(guò)短,且池大小不可控,因而不適合作連接池。僅適用于增加對(duì)象重用機(jī)率,減少GC負(fù)擔(dān)。2

執(zhí)行結(jié)果:

單線程情況下,遍歷其它無(wú)元素的P,長(zhǎng)時(shí)間加鎖性能低下。啟用協(xié)程改善。

結(jié)果:

測(cè)試場(chǎng)景在goroutines遠(yuǎn)大于GOMAXPROCS情況下,與非池化性能差異巨大。

測(cè)試結(jié)果

可以看到同樣使用*sync.pool,較大池大小的命中率較高,性能遠(yuǎn)高于空池。

結(jié)論:pool在一定的使用條件下提高并發(fā)性能,條件1是協(xié)程數(shù)遠(yuǎn)大于GOMAXPROCS,條件2是池中對(duì)象遠(yuǎn)大于GOMAXPROCS。歸結(jié)成一個(gè)原因就是使對(duì)象在各個(gè)P中均勻分布。

池pool和緩存cache的區(qū)別。池的意思是,池內(nèi)對(duì)象是可以互換的,不關(guān)心具體值,甚至不需要區(qū)分是新建的還是從池中拿出的。緩存指的是KV映射,緩存里的值互不相同,清除機(jī)制更為復(fù)雜。緩存清除算法如LRU、LIRS緩存算法。

池空間回收的幾種方式。一些是GC前回收,一些是基于時(shí)鐘或弱引用回收。最終確定在GC時(shí)回收Pool內(nèi)對(duì)象,即不回避GC。用java的GC解釋弱引用。GC的四種引用:強(qiáng)引用、弱引用、軟引用、虛引用。虛引用即沒(méi)有引用,弱引用GC但有空間則保留,軟引用GC即清除。ThreadLocal的值為弱引用的例子。

regexp 包為了保證并發(fā)時(shí)使用同一個(gè)正則,而維護(hù)了一組狀態(tài)機(jī)。

fmt包做字串拼接,從sync.pool拿[]byte對(duì)象。避免頻繁構(gòu)建再GC效率高很多。

網(wǎng)頁(yè)名稱(chēng):Go語(yǔ)言lru算法 go語(yǔ)言方法和函數(shù)
瀏覽地址:http://chinadenli.net/article42/hgcsec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)定制開(kāi)發(fā)、虛擬主機(jī)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)