• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            SmartPtr
            本博客已搬至:http://www.cnblogs.com/baiyanhuang/
            posts - 29,comments - 176,trackbacks - 0
            By SmartPtr(http://www.shnenglu.com/SmartPtr/)
              
                目前所做的項(xiàng)目,今年應(yīng)該是第5個(gè)release了, 走過(guò)了這5年的風(fēng)風(fēng)雨雨,中間幾度更易開(kāi)發(fā)人員,現(xiàn)在的團(tuán)隊(duì)與5年前的團(tuán)隊(duì)已是兩個(gè)完全沒(méi)有“交集”的團(tuán)隊(duì), 這樣必然導(dǎo)致我們對(duì)項(xiàng)目會(huì)存在很多的不理解,不理解其初衷,不理解其原始設(shè)計(jì),不理解其代碼。。。對(duì)一些不理解的地方不敢大動(dòng)手腳,只能修修補(bǔ)補(bǔ)以完成需要的功能,其結(jié)局從開(kāi)發(fā)角度看就是總體設(shè)計(jì)的缺失, 代碼結(jié)構(gòu)的混亂,從功能角度看就是容易出錯(cuò),運(yùn)行速度極慢。

                項(xiàng)目極其需要一次深入的代碼重構(gòu)與性能提升,而這都至少需要一個(gè)release的時(shí)間來(lái)做,對(duì)于代碼重構(gòu), 從商業(yè)的角度來(lái)講,是十分不可取的,一是其風(fēng)險(xiǎn)比較大,大刀闊斧的重構(gòu),如何保證軟件的原有功能是個(gè)大問(wèn)題; 而整整一個(gè)release的時(shí)間做重構(gòu),對(duì)于用戶來(lái)講,他拿到新的版本時(shí),看不到任何新功能與提高,難道你告訴他,我們的代碼結(jié)構(gòu)現(xiàn)在很elegent。。。;但對(duì)于性能提升,現(xiàn)在是到了不得不做的地步,因?yàn)槟軌虼蠓鹊奶嵘阅埽氡赜脩粢材芙邮芤粋€(gè)沒(méi)有新功能的新版本。

                于是, 我們決定用一個(gè)release的時(shí)間來(lái)做性能優(yōu)化。

                當(dāng)然,我們不打算從學(xué)術(shù)的角度來(lái)考慮, 這個(gè)是O(n) 的算法,那個(gè)是O(nlgn) 的。。。; 也不打算從語(yǔ)言的角度來(lái)看待, 傳引用要比傳值快,類成員在初始化列表初始化。。。;當(dāng)然, 并不是說(shuō)這些不重要, 只是這些都應(yīng)該是比較常見(jiàn)的,大家都應(yīng)該清楚的事情, 也就是說(shuō)我們假設(shè)我們的項(xiàng)目中不存在這種問(wèn)題; 另外就是從語(yǔ)言角度來(lái)做的優(yōu)化, 對(duì)我們的性能提升幫助不會(huì)太大。 我們會(huì)從一個(gè)宏觀的,特定于我們項(xiàng)目workflow方面的角度來(lái)做優(yōu)化。 主要包括以下幾個(gè)方面:

                 一、集中處理 (batch processing)

                 把相關(guān)的操作集中起來(lái)處理, 從程序原理上來(lái)講, 集中做相同的操作, 由于數(shù)據(jù)局部性的原理, 很多數(shù)據(jù)可以直接從cache中取得, 速度會(huì)比較快。 但我們主要考慮的還是另外一個(gè)因素,減少不必要的重復(fù)的初始化,假設(shè)將我有十個(gè)對(duì)象要update 一般情況下, 為了做update, 我們必然要準(zhǔn)備某些前提數(shù)據(jù), 如果十個(gè)對(duì)象分別處理, 我就要初始化十次, 但如果我先把這十個(gè)對(duì)象收集起來(lái),到最后一起處理, 最后只會(huì)初始化一次前提數(shù)據(jù)。 這對(duì)于update對(duì)象密集的情況十分有用。 當(dāng)然, 這樣我們也能有效的減少函數(shù)調(diào)用次數(shù), 對(duì)性能提高也有不少的幫助。

                 二、減少重復(fù)操作(初始化) (reduce repeated operations)

                  重復(fù)操作, 一個(gè)是在有循環(huán)的時(shí)候, 我應(yīng)該盡量把一些common的操作, 如一些輸入數(shù)據(jù)的初始化提到循環(huán)外面來(lái)做,這在上面一點(diǎn)中也提到過(guò)。 二是對(duì)于一些全局的屬性,操作等, 我們應(yīng)該放在內(nèi)存里,并提供一個(gè)全局訪問(wèn)點(diǎn)來(lái)直接得到, 而不是每次在需要的時(shí)候都去重新初始化一遍。 舉個(gè)例子來(lái)講, 每個(gè)application應(yīng)該都有他自己的一些configuration, setting, 如果每次我需要這些信息的時(shí)候, 都從文件,或者注冊(cè)表去讀一次, 那就非常的浪費(fèi)時(shí)間了, 尤其是涉及到I/O操作的時(shí)候。 當(dāng)然, 這個(gè)有點(diǎn)像 cache的概念, 但是還遠(yuǎn)遠(yuǎn)不及。

                 三、消除冗余操作 (avoid redundant operations)

                也許你不相信, 一個(gè)項(xiàng)目經(jīng)過(guò)很多不同的人的開(kāi)發(fā), 由于理解上的誤差,以及時(shí)間緊迫倉(cāng)促完工,很多workflow上可能會(huì)都重復(fù)的操作, 仔細(xì)檢察, 從全局上來(lái)考慮整個(gè)流程,你會(huì)發(fā)現(xiàn), 其實(shí)我們做了很多不該做的事。

                 四、cache機(jī)制 (cache mechanism)

                 Cache的原理是用空間換時(shí)間, 當(dāng)然,這個(gè)空間是指內(nèi)存。我們把一些重要的中間信息放在內(nèi)存中,以極大的提高查找,更新的速度。一般常用的數(shù)據(jù)結(jié)構(gòu)就是map, 比如一個(gè)對(duì)象有長(zhǎng)度這么一個(gè)屬性, 但每次去得這個(gè)長(zhǎng)度的時(shí)候都需要經(jīng)過(guò)復(fù)雜的耗時(shí)的計(jì)算, 如果我們有些操作需要大量的使用到這個(gè)對(duì)象及其屬性, 我們就可以建這樣一個(gè)map: map<對(duì)象指針,長(zhǎng)度> 這樣每次用到時(shí), 我只要到這個(gè)map中去查就可以了, 如果某個(gè)對(duì)象被更新了,我們需要更新這個(gè)map, 也就是說(shuō)維護(hù)cache.

                 五、延遲更新 (defer update)

                  這是一個(gè)講究策略的做法, 比如說(shuō)我們的項(xiàng)目要在9.1號(hào)前demo給客戶, 我們要寫好代碼,并維護(hù)好文檔, 但是時(shí)間很急, 如果我們?cè)?/span>9.1號(hào)前把這兩件時(shí)都要做好,恐怕要瘋狂加班了, 但是我們知道,客戶只需要看到我們軟件運(yùn)行的效果, 文檔他暫時(shí)并不關(guān)心, 那好吧, 我們9.1前就寫代碼, 文檔就在demo后寫好了。當(dāng)然舉這個(gè)例子的并不是鼓勵(lì)大家先寫代碼,后補(bǔ)文檔, 而是為了說(shuō)明有些事情, 如果資源緊張, 我們可以把他分開(kāi)看待,對(duì)于要的不急的那部分, 我們可以先不做, 等到時(shí)不忙了, 需要了的時(shí)候再做, 以緩解當(dāng)前的緊張。 從代碼角度舉個(gè)例子, 假設(shè)我們有十條樣條曲線需要更新, 更新可能包括樣條線的方程,圖形顯示, 以及其長(zhǎng)度等等, 如果我這些事情我一下子全做了, 用戶可能要等很久, 但是我們知道, 用戶做了這個(gè)操作, 他只需要看到圖形上更新就可以了, 至于長(zhǎng)度等什么的, 等他需要了, 或者空閑的時(shí)候,我們?cè)俳o他更新, 這就讓整個(gè)操作比較流暢了。

                 這是我通過(guò)這個(gè)release對(duì)軟件優(yōu)化的一些想法,我相信現(xiàn)實(shí)中優(yōu)化的方法是多種多樣的,我希望這篇文章能夠起到拋磚引玉的作用,希望大家能夠提出自己的一些經(jīng)驗(yàn)來(lái)共同分享。

            posted on 2007-08-10 18:10 SmartPtr 閱讀(1193) 評(píng)論(10)  編輯 收藏 引用

            FeedBack:
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-10 21:36 | missdeer
            這文章總結(jié)得好  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-10 21:37 | pass86
            最強(qiáng)的優(yōu)化,還是算法優(yōu)化。  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-10 22:43 | SmartPtr
            因?yàn)樗惴ㄉ系膬?yōu)化一般都是為大家所知的, 所以在開(kāi)發(fā)過(guò)程中也會(huì)特別注意, 因此這方面的優(yōu)化并不是我們的側(cè)重點(diǎn)  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-10 22:52 | aGAric
            很好,不過(guò)不同情況下實(shí)踐起來(lái)會(huì)有不同的重點(diǎn)  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-10 23:03 | SmartPtr
            @aGAric
            的確, 但這些應(yīng)該是一些比較COMMON的想法, 也就是說(shuō)我們?cè)谧鰞?yōu)化的時(shí)候會(huì)去想到, 并可能有用的想法, 不知道你沒(méi)有其他類似的方法, 大家可以一起討論討論:)  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-11 00:03 | 羅賓李
            如果是java,那優(yōu)化的余地不大。但是如果是c++,那不同的實(shí)現(xiàn)效果會(huì)差別很大,c++里面有很多技巧是java里面不能用的,比如創(chuàng)建私有堆,重載資源分配等等,當(dāng)然,最重要的是使用了合適的東西去做恰當(dāng)?shù)氖虑椤?
            看了你的文章有一個(gè)地方我不能不指出,就是你說(shuō)用一個(gè)map來(lái)保存對(duì)象的長(zhǎng)度這個(gè)做法我認(rèn)為是很不科學(xué)的,首先map的查找時(shí)間是O(logN)級(jí)別的,反復(fù)查找總是有開(kāi)銷的,其次既然你已經(jīng)用對(duì)象指針做key,那為何不把長(zhǎng)度做為對(duì)象的一個(gè)屬性,那樣更新和獲取都是O(1)的,當(dāng)對(duì)象數(shù)量非常巨大時(shí),你會(huì)知道這個(gè)差別有多大。一般map用在正好相反的情況,就是根據(jù)長(zhǎng)度找對(duì)象,這個(gè)時(shí)候用map是很不錯(cuò)呃選擇,如果長(zhǎng)度有重復(fù),可以考慮multimap。
            根據(jù)我經(jīng)歷過(guò)的幾個(gè)c++的優(yōu)化項(xiàng)目,最終的瓶頸都是在如何正確的cache數(shù)據(jù)上。  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-11 00:58 | SmartPtr
            @羅賓李
            1. 當(dāng)然,對(duì)于特定于語(yǔ)言的優(yōu)化,C++比Java應(yīng)該要好一些, 畢竟C++是一個(gè)更底層,可控性更強(qiáng)的語(yǔ)言。 但是對(duì)于workflow上的優(yōu)化, 應(yīng)該是語(yǔ)言無(wú)關(guān)的。我們所做的性能的提升,大部分是靠對(duì)workflow的優(yōu)化實(shí)現(xiàn)的。

            2. 關(guān)于map使用, 謝謝你的評(píng)論, 你說(shuō)的很對(duì)。 這個(gè)例子為了簡(jiǎn)化,我沒(méi)有給出足夠的context. 我補(bǔ)充一些吧:
            1) 該對(duì)象是一個(gè)API, 一個(gè)第三方庫(kù),我們沒(méi)有權(quán)限去修改
            2) 假設(shè)這個(gè)對(duì)象是一條樣條曲線, 該第三方庫(kù)沒(méi)有在該對(duì)象中加入一個(gè)長(zhǎng)度屬性,而是在每次需要時(shí)去計(jì)算,從數(shù)學(xué)角度,我想應(yīng)該也有其道理。(這樣我就能保證每次取到的都是最新的)
            重要的是,我們都認(rèn)同cache是性能優(yōu)化的利器, 的確,設(shè)計(jì)好的cache數(shù)據(jù)結(jié)構(gòu)的確很重要,當(dāng)然,這都是和特定需求緊密結(jié)合在一起的。

              回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法[未登錄](méi)
            2007-08-13 09:40 | 夢(mèng)在天涯
            很好,就是有點(diǎn)抽象哦,哈哈!  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-13 10:05 | zenith
            還好,我們做的項(xiàng)目都不是太大,重構(gòu)一次也不算很難,呵呵。。。  回復(fù)  更多評(píng)論
              
            # re: 我對(duì)軟件優(yōu)化的一些想法
            2007-08-16 12:51 | houdy
            對(duì)于算法的好壞,只有當(dāng)N相當(dāng)大的時(shí)候,效果才很明顯,對(duì)于一般的情況從O(N^2)優(yōu)化到O(NlogN),效果并不是很明顯.
            但是LZ說(shuō)得這幾種情況,有時(shí)候效果卻很明顯.其中的cache的思想,幾乎應(yīng)用到計(jì)算機(jī)領(lǐng)域的各個(gè)方面,例如對(duì)于數(shù)據(jù)存儲(chǔ),CPU緩存,內(nèi)存,硬盤,網(wǎng)絡(luò)硬盤,不就是用速度快的設(shè)備去cache數(shù)據(jù)慢的設(shè)備么?
              回復(fù)  更多評(píng)論
              
            午夜精品久久久久久影视riav| 精品国产乱码久久久久久1区2区 | 久久―日本道色综合久久| 久久亚洲国产精品成人AV秋霞| 色综合久久天天综线观看| 欧美精品一区二区久久| 性做久久久久久久久老女人| 欧美亚洲日本久久精品| 国产免费久久精品99re丫y| 久久香综合精品久久伊人| 亚洲综合精品香蕉久久网| 久久亚洲AV成人出白浆无码国产 | 少妇无套内谢久久久久| 无码国内精品久久人妻| 91精品国产综合久久久久久| 国产91久久综合| 亚洲午夜无码久久久久小说| 性做久久久久久久| 青草影院天堂男人久久| 久久精品视频一| 日韩久久久久久中文人妻| 伊人色综合久久天天| 久久九九久精品国产| 亚洲乱码中文字幕久久孕妇黑人| 久久精品无码专区免费青青 | 99久久超碰中文字幕伊人| 国产精品免费看久久久香蕉| 国产一区二区久久久| 久久久久国产一级毛片高清版| 久久久久久噜噜精品免费直播| 亚洲AV日韩AV永久无码久久| 国内精品久久久久久麻豆| 伊人色综合久久天天人手人婷| 伊人久久免费视频| 久久久久久九九99精品| 欧美午夜A∨大片久久| 久久er国产精品免费观看2| 99精品国产99久久久久久97| 国产午夜电影久久| 久久久久久久99精品免费观看| 久久人人爽人人爽人人片AV东京热 |