|
近來發(fā)現(xiàn),有很多同事在設(shè)計(jì)ASP.NET Application時(shí),選擇用字符串拼Html文本而不用GridView等控件,原因居然是“ASP.NET太慢”。看來有必要再次明確一個(gè)本質(zhì)問題:我們是做產(chǎn)品的,不是搞學(xué)術(shù)研究的;同時(shí)要強(qiáng)調(diào)一個(gè)習(xí)慣:要用事實(shí)去證明你的猜測,而不要臆斷。
一、Remember:我們是做產(chǎn)品的,不是搞學(xué)術(shù)研究的
直接貼一個(gè)前陣子的一封郵件,“全在郵件里面了”:
發(fā)件人:發(fā)送時(shí)間:
收件人:
主題: 答復(fù): 關(guān)于WebService的性能損失
這個(gè)問題里面,缺少對(duì)用戶場景的描述。
我認(rèn)為,我們實(shí)際應(yīng)該關(guān)心的并不是這兩種方式的性能究竟差別有幾倍,而是他們是否會(huì)對(duì)用戶、對(duì)業(yè)務(wù)產(chǎn)生影響。
在這個(gè)例子里面,1500次的訪問,WebService多出了5000毫秒,平均每次訪問多出了3ms。那么我有以下幾個(gè)問題:
1、當(dāng)用戶執(zhí)行一次操作的時(shí)候,會(huì)調(diào)用幾次Web Service,從而會(huì)多出多少毫秒?
2、多出的這些時(shí)間,是不是我們必須省下來,還是在允許接受的范圍內(nèi)、可以忽略不計(jì)?
3、如果用戶的一次操作確實(shí)需要繼續(xù)節(jié)省時(shí)間,是通過改接口方式更好更有效,還是通過其他方式(比如使用緩存、禁用ViewState、局部刷新等)更好更有效?
我覺得只有把這些用戶場景描述出來,才好決策。 只要放在正確、合適的環(huán)境之中,任何一個(gè)方法都有可能是好的方法。
我認(rèn)為一個(gè)優(yōu)秀的軟件開發(fā)人員必須對(duì)程序的性能保持敏感。實(shí)際在.NET中,如果傳遞的數(shù)據(jù)量比較大,Web Service與Odbc方式的性能差距遠(yuǎn)不止3倍,另外使用反射與直接訪問的方式相比性能差別可能超過百倍,使用屬性與使用字段的方式相比性能也有幾倍的差距。
但同時(shí),我們不能局限在這些“倍數(shù)”中,要更多的關(guān)注這些差距所造成的最終影響,而不能單純的從性能差距的倍數(shù)去判斷是否使用某個(gè)技術(shù)。
就以差距明顯的反射來說。如果是直接訪問字段,只要執(zhí)行幾條cpu指令就夠了;但如果使用反射,則可能需要執(zhí)行幾百條cpu指令。他們的性能差距很明顯。但是,對(duì)于目前主頻動(dòng)輒幾個(gè)G的cpu來說,這幾百條指令是我們不能接受的么?即便用戶的一次操作會(huì)觸發(fā)成百上千次反射、一共多執(zhí)行數(shù)萬條cpu指令,轉(zhuǎn)換成CPU時(shí)間也只是以微秒計(jì)。
反而是網(wǎng)絡(luò)傳輸、磁盤IO這些影響性能的大頭,也許將這些環(huán)節(jié)的性能提高10%,就會(huì)對(duì)用戶或者業(yè)務(wù)產(chǎn)生明顯的改善了。
發(fā)件人:
發(fā)送時(shí)間:
收件人:
主題: 答復(fù): 關(guān)于WebService的性能損失
請(qǐng)架構(gòu)的同事一起評(píng)審一下吧
發(fā)件人:
發(fā)送時(shí)間:
收件人:
主題: 關(guān)于WebService的性能損失
寫了個(gè)簡單的測試,
訪問同一個(gè)數(shù)據(jù)庫表,訪問1500次,一個(gè)直接通過Odbc訪問,一個(gè)通過WebService封裝轉(zhuǎn)發(fā)一遍,
發(fā)現(xiàn)使用WebService后,花費(fèi)的時(shí)間大約是直接訪問的3倍左右
測試的數(shù)據(jù)如下,時(shí)間單位為ms
直接訪問數(shù)據(jù)庫時(shí)間:
2718.75
通過WebService訪問數(shù)據(jù)庫時(shí)間:
7750
直接訪問數(shù)據(jù)庫時(shí)間:
2656.25
通過WebService訪問數(shù)據(jù)庫時(shí)間:
7703.125
直接訪問數(shù)據(jù)庫時(shí)間:
2750
通過WebService訪問數(shù)據(jù)庫時(shí)間:
7656.25
鑒于這個(gè)性能損失比較大,ADS訪問配置庫時(shí)還是直接訪問數(shù)據(jù)庫吧,只是把對(duì)配置庫的訪問放到一個(gè)單獨(dú)的DLL中,避免混到一起就是。
NET技術(shù):Remember: 我們是做產(chǎn)品的,不是搞學(xué)術(shù)研究的 & 用事實(shí)說話,不要臆斷,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。