zoukankan      html  css  js  c++  java
  • 控制台进程优化分析

          自己做的模块, 内存占用太高了, 一个并非进程占用了20多M, boss和客户都受不了了,勒令优化内存.

          没有想到什么好的优化方法前,先来招笨招, 优化dll引用.

    优化思路: 1 能不调用的dll一定要排除

                  2 所有进程都需要调用的功能尽可能合并.

    沿着这个思路开动,  一下午的dug, 跟踪....

    先在程序里面植入debug语句,将时间点打印出来, 看看什么代码都干了什么坏事.

    未优化前, 单步输入如下:

     “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    启动进程: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    结束远程调用,获取用户信息: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Data.Linq\3.5.0.0__b77a5c561934e089\System.Data.Linq.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    启动心跳: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    启动结束: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    启动进程: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “VirtualPortServiceConsole.vshost.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\CustomMarshalers\2.0.0.0__b03f5f7f11d50a3a\CustomMarshalers.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “VirtualPortServiceConsole.vshost.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    结束远程调用,获取用户信息: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Data.Linq\3.5.0.0__b77a5c561934e089\System.Data.Linq.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    启动结束: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    启动进程: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “VirtualPortServiceConsole.vshost.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\CustomMarshalers\2.0.0.0__b03f5f7f11d50a3a\CustomMarshalers.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “VirtualPortServiceConsole.vshost.exe”(托管): 已加载“C:\Windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    结束远程调用,获取用户信息: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”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    “NeConnection.exe”(托管): 已加载“C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”,已跳过符号加载。已对模块进行了优化并启用了调试器选项“仅我的代码”。
    启动结束:2009/11/3 15:42:56
    “NeConnection.exe”(托管): 已加载“F:\当前工作\联机指令平台\2.程序代码\VirtualPortService\VirtualPortServiceConsole\bin\Debug\Emcaster.dll”,符号已加载。

    到此, 一阶段优化已经达标了.

    优化完了, 总结了一下,代码的问题:

    1: 开发的时候, 对于内存控制没有概念, 对于dll引入没有给予足够的关注,导致dll乱引用.

    2: 在设计模块的时候, 有些地方的没有考虑系统开销, 导致工作效率很低.

        但是这个问题在开发的时候, 有时候 是不可避免的, 第一优先级的是简单实现(毕竟我们是做应用开发的), 但是需要养成好的习惯, 不然写三行代码就1M内存,这个代价是任何一个boss都不会接受的.

    3: 质量意识, 这个是关键. 开发时一般的问题不是没有质量意识, 而是质量意识不严格. 尽量提高对代码的要求. 这样在面对客户和boss时我们会更有底气了.

  • 相关阅读:
    The formatter threw an exception while trying to deserialize the message in WCF
    通过Web Deploy方式部署WCF
    The Managed Metadata Service or Connection is currently not available
    How to create Managed Metadata Column
    冒泡算法
    asp.net core 实战项目(一)——ef core的使用
    Vue学习笔记入门篇——安装及常用指令介绍
    Vue学习笔记入门篇——数据及DOM
    Vue学习笔记目录
    Chart.js在Laravel项目中的应用
  • 原文地址:https://www.cnblogs.com/dunnice/p/1595369.html
Copyright © 2011-2022 走看看