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