自己做的模組, 記憶體佔用太高了, 一個並非進程佔用了20多M, boss和客戶都受不了了,勒令最佳化記憶體.
沒有想到什麼好的最佳化方法前,先來招笨招, 最佳化dll引用.
最佳化思路: 1 能不調用的dll一定要排除
2 所有進程都需要調用的功能儘可能合并.
沿著這個思路開動, 一下午的dug, 跟蹤....
先在程式裡面植入debug語句,將時間點列印出來, 看看什麼代碼都幹了什麼壞事.
未最佳化前, 單步輸入如下:
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\NeConnection.exe”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.DataEntity.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.RemotingObjectLib.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.UserIdentityInterface.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.NeAdapterBase.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.Equipment.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
啟動進程:2009/11/3 14:26:51
開始遠程調用,擷取使用者資訊:2009/11/3 14:26:51
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Runtime.Remoting\2.0.0.0__b77a5c561934e089\System.Runtime.Remoting.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
結束遠程調用,擷取使用者資訊:2009/11/3 14:26:52
開始遠程調用,查看連接埠串連數限制:2009/11/3 14:26:52
結束遠程調用,查看連接埠串連數限制:2009/11/3 14:26:52
啟動逾時不活動監控對象:2009/11/3 14:26:52
啟動多播訊息對象:2009/11/3 14:26:52
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.DataAccess.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Core\3.5.0.0__b77a5c561934e089\System.Core.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Data.Linq\3.5.0.0__b77a5c561934e089\System.Data.Linq.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“Anonymously Hosted DynamicMethods Assembly”
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Xml.Linq\3.5.0.0__b77a5c561934e089\System.Xml.Linq.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
啟動心跳:2009/11/3 14:26:52
擷取網元所屬的網元組的:2009/11/3 14:26:52
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.PgmSocket.dll”,符號已載入。
啟動網元連線物件:2009/11/3 14:26:52
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Dart.PowerTCP.Telnet.dll”
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
啟動結束:2009/11/3 14:26:52
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Emcaster.dll”,符號已載入。
發現不對勁的地方了, 啟動多播訊息對象 ,這個一個純Socket操作的模組,怎麼引用了一大堆不認識的dll, review代碼, 一通改. ok成了下面的樣子.
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.UserIdentityInterface.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\NeConnection.exe”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.DataEntity.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.RemotingObjectLib.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.UserIdentityInterface.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.NeAdapterBase.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.Equipment.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
啟動進程:2009/11/3 15:08:38
開始遠程調用,擷取使用者資訊:2009/11/3 15:08:38
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Runtime.Remoting\2.0.0.0__b77a5c561934e089\System.Runtime.Remoting.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“Ultra.Nmos.NeIdentityImplementForCommon”
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.NeIdentityInterface.dll”,符號已載入。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“Ultra.Nmos.UserIdentityImplementForNmos”
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.DirectoryServices\2.0.0.0__b03f5f7f11d50a3a\System.DirectoryServices.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\CustomMarshalers\2.0.0.0__b03f5f7f11d50a3a\CustomMarshalers.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
結束遠程調用,擷取使用者資訊:2009/11/3 15:08:40
開始遠程調用,查看連接埠串連數限制:2009/11/3 15:08:40
結束遠程調用,查看連接埠串連數限制:2009/11/3 15:08:40
啟動逾時不活動監控對象:2009/11/3 15:08:40
啟動多播訊息對象:2009/11/3 15:08:40
啟動心跳:2009/11/3 15:08:40
擷取網元所屬的網元組的:2009/11/3 15:08:40
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.DataAccess.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.PgmSocket.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Core\3.5.0.0__b77a5c561934e089\System.Core.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Data.Linq\3.5.0.0__b77a5c561934e089\System.Data.Linq.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“Anonymously Hosted DynamicMethods Assembly”
啟動網元連線物件:2009/11/3 15:08:40
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Xml.Linq\3.5.0.0__b77a5c561934e089\System.Xml.Linq.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Dart.PowerTCP.Telnet.dll”
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
啟動結束:2009/11/3 15:08:40
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Emcaster.dll”,符號已載入。
還算不多, 不過看見那一大堆的linq, 好像也沒有用到,必須幹掉:
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.UserIdentityInterface.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\NeConnection.exe”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.DataEntity.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.RemotingObjectLib.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.UserIdentityInterface.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.NeAdapterBase.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.Equipment.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.PgmSocket.dll”,符號已載入。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
啟動進程:2009/11/3 15:42:54
開始遠程調用,擷取使用者資訊:2009/11/3 15:42:54
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Runtime.Remoting\2.0.0.0__b77a5c561934e089\System.Runtime.Remoting.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“Ultra.Nmos.NeIdentityImplementForCommon”
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Ultra.Nmos.NeIdentityInterface.dll”,符號已載入。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“Ultra.Nmos.UserIdentityImplementForNmos”
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.DirectoryServices\2.0.0.0__b03f5f7f11d50a3a\System.DirectoryServices.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\CustomMarshalers\2.0.0.0__b03f5f7f11d50a3a\CustomMarshalers.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“VirtualPortServiceConsole.vshost.exe”(託管): 已載入“C:\Windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
結束遠程調用,擷取使用者資訊:2009/11/3 15:42:56
開始遠程調用,查看連接埠串連數限制:2009/11/3 15:42:56
結束遠程調用,查看連接埠串連數限制:2009/11/3 15:42:56
啟動逾時不活動監控對象:2009/11/3 15:42:56
啟動多播訊息對象:2009/11/3 15:42:56
啟動心跳:2009/11/3 15:42:56
擷取網元所屬的網元組的:2009/11/3 15:42:56
啟動網元連線物件:2009/11/3 15:42:56
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Dart.PowerTCP.Telnet.dll”
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
“NeConnection.exe”(託管): 已載入“C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”,已跳過符號載入。已對模組進行了最佳化並啟用了調試器選項“Just My Code”。
啟動結束:2009/11/3 15:42:56
“NeConnection.exe”(託管): 已載入“F:\當前工作\聯機指令平台\2.程式碼\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Emcaster.dll”,符號已載入。
到此, 一階段最佳化已經達標了.
最佳化完了, 總結了一下,代碼的問題:
1: 開發的時候, 對於記憶體控制沒有概念, 對於dll引入沒有給予足夠的關注,導致dll亂引用.
2: 在設計模組的時候, 有些地方的沒有考慮系統開銷, 導致工作效率很低.
但是這個問題在開發的時候, 有時候 是不可避免的, 第一優先順序的是簡單實現(畢竟我們是做應用開發的), 但是需要養成好的習慣, 不然寫三行代碼就1M記憶體,這個代價是任何一個boss都不會接受的.
3: 品質意識, 這個是關鍵. 開發時一般的問題不是沒有品質意識, 而是品質意識不嚴格. 盡量提高對代碼的要求. 這樣在面對客戶和boss時我們會更有底氣了.