.NET 内部效能插件

原创 2013年12月12日 14:36:31

简介

这篇文章将介绍一个自制的简易插件。

因为在release版用windows的task manager感觉很麻烦,每次都要找一下自己的程序,就临时想到乾脆做一个简单的小插件来玩玩。

如何使用

static void Main()
{
    PerformanceDetector.Instance.initialize();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new frmMain());
    PerformanceDetector.Instance.destroy();
} 

开启工程中的Program.cs,然后于Main中加入两行代码。

PerformanceDetector.Instance.initialize(); 

PerformanceDetector.Instance.destroy(); 


将第一行代码加于Application.Run()之前,将第二行代码加于Application.Run()之后。

就可以在运行时透过Alt+Ctrl+M呼叫这个插件了。

关于这插件的构想

因为不喜欢每次都用Task Manager,就自己整个了内存监控的代码。

一开始只是想说做个在应用内监控内存使用量的代码。所以使用Process来获取内存使用量。

但又觉得每次都去打开Log档来看很麻烦,就想说做个UI来看好了。

然后又想说,那要怎么显示这个控件?想了想既不想做在Menu也不想用一个按钮或其他控件,最后就决定用快捷来处理了。

不过第一版没有仔细想好,搞了个占据了全部画面的控件。用了才发现这样也不能边操作边看用量,好吧,重做。

所以最后决定了,就用一个单一的窗口来显示,会比较乾净。

想说CPU使用量也可以一起监控,就顺便做了。

本来是有在考虑原本第一版做的比较详细的需不需要有,但后来想想目前似乎还用不到,于是最后做成这样。

这工具中使用的技术

第一个关于CPU的使用部分,用的是PerformaceCounter来处理的

theCPUCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);
m_cpuUsage = (int)(theCPUCounter.NextValue() / Environment.ProcessorCount); 

public PerformanceCounter(
	string categoryName,
	string counterName,
	string instanceName )  


我需要抓的是当前进程的CPU使用率,所以第一个参数用"Process",第二个参数用"% Processor Time",第三个进程则是用当前进程的名称。

利用Process.GetCurrentProcess().ProcessName取得。

只要呼叫PerformanceCounter.NextValue()就可以取得CPU使用率,并透过Enviroment.ProcessorCount来计算。

另外由于我是利用快捷键的方式来显示窗口。所以利用了Hook来拦截按键。

HookManager.Instance.RegisterHook(HookType.WH_KEYBOARD, new CustomHookProc.HookProcHandler(KeyboardHookProc));

void KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    KeyStateInfo ctrlKey = KeyboardInfo.GetKeyState(Keys.ControlKey);
    KeyStateInfo altKey = KeyboardInfo.GetKeyState(Keys.Alt);
    KeyStateInfo mKey = KeyboardInfo.GetKeyState(Keys.M);
    if (ctrlKey.IsPressed && altKey.IsPressed && mKey.IsPressed)
    {
        showMonitorForm();
    }
} 

HookManager是我自己封装过的一个简易Hook类,只需透过注册事件即可使用。

最后是利用Process.WorkingSet64来取得进程内存。

Process currentProcess = Process.GetCurrentProcess();
currentProcess.WorkingSet64; 

以及使用Process.Modules跟ProcessModule.ModuleMemorySize来取得相关DLL的使用内存。


ProcessModuleCollection myProcessModuleCollection = currentProcess.Modules;
// Display the 'ModuleMemorySize' of each of the modules.
ProcessModule myProcessModule;
for (int i = 0; i < myProcessModuleCollection.Count; i++)
{
    myProcessModule = myProcessModuleCollection[i];
    if (m_moduleMemorys.Keys.Contains(myProcessModule.ModuleName))
        m_moduleMemorys[myProcessModule.ModuleName].update(myProcessModule.ModuleMemorySize);
    else
    {
        MemoryInfo mem = new MemoryInfo();
        mem.Name = myProcessModule.ModuleName;
        mem.update(myProcessModule.ModuleMemorySize);
        m_moduleMemorys[myProcessModule.ModuleName] = mem;
    }
} 


public class MemoryInfo
{
    string m_name;
    long m_currentUsage;
    long m_maximumUsage;
    public long MaximumUsage
    {
        get { return m_maximumUsage; }
        set { m_maximumUsage = value; }
    }
    public long CurrentUsage
    {
        get { return m_currentUsage; }
        set { m_currentUsage = value; }
    }
    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }
    public string GetCurrentKB()
    {
        return Convert.ToString(m_currentUsage / 1024.0);
    }
    public string GetMaximumKB()
    {
        return Convert.ToString(m_maximumUsage / 1024.0);
    }
    public void update(long current)
    {
        m_currentUsage = current;
        if (m_currentUsage > m_maximumUsage)
            m_maximumUsage = m_currentUsage;
    }
} 


在代码中,声明了一个简单的类,来储存信息。

Name: 储存 ProcessModule.ModuleName。

CurrentUsage: 储存现在内存用量。

MaximumUsage: 储存最大内存用量。

代码下载


一些常見的SQL效能問題

1.      對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  2.      應儘量避免在 where 子句中對欄位進行 null 值判斷...
  • Avan_Lau
  • Avan_Lau
  • 2010年03月02日 11:26
  • 3463

加速SQL查询效能的七大秘诀

  任何平台的SQL开发者都有自身的困惑,似乎他们一直纠缠在DO WHILE循环里,这个循环让他们不断地重复同样的错误。这是因为数据库的发展依然不够成熟。当然,供应商们也在不断进步,但是他们还是需要处...
  • zhupopo
  • zhupopo
  • 2010年12月07日 16:11
  • 655

SQL Server 效能优化

优化数据库的思想:================1、关键词段建立索引。2、使用存储过程,它使SQL变得更加灵活和高效。3、备份数据库和清除垃圾资料。4、SQL语句语法的优化。(可以用Sybase的S...
  • lanmao100
  • lanmao100
  • 2007年11月02日 13:02
  • 828

Java性能规范

1、对于常用工具类的方法,需要关注同步问题 2、对于不能确认被其它代码如何调用的方法或者可能被其它代码频繁调用的方法,需要关注同步问题 3、对于常量字符串,不要通过new方式来创建 4、对于常量...
  • hzd_123
  • hzd_123
  • 2014年02月24日 12:14
  • 455

首届阿里巴巴研发效能嘉年华

全文链接 热门推荐  (1)架构研发 持续集成与交付:阿里最佳实践  直播简介:本系列直播由阿里旗下一站式研发提效平台云效策划推出,主要为大家详细介绍阿里巴巴在持续...
  • bystarlight
  • bystarlight
  • 2017年06月06日 13:44
  • 471

【转】效能...效能...效能!!

UnityIn这次整理了一些程式人员在UNITY开发上与“效能”相关,需要注意的“关键点”:暂存常用的Component:根据官方文件的描述,每次GetComponent的呼叫,UNITY都会花点时间...
  • Ralfkaka
  • Ralfkaka
  • 2013年08月26日 11:35
  • 504

net start mysql 的时候,提示net不是内部或者外部命令。。。。。。

这是因为没有用管理员身份去运行cmd 1.在开始菜单的搜索框张收入cmd,然后右键单击,并选择以管理员身份运行! 如果每天都要启动mysql服务,这样不很麻烦?所以: 2.右键单击c...
  • daijiguo
  • daijiguo
  • 2015年05月19日 19:36
  • 3226

Mysql 下载与安装问题二:安装完MySQL后输入"net start mysql"后提示"'net'不是内部或外部命令...

声明:本文只针对我所安装的MySQL 5.7.18(64位)版本所遇到的问题。 问题:           安装完MySQL后输入"net start mysql"后提示"'net'不是内部或外部...
  • xunalove
  • xunalove
  • 2017年06月01日 09:05
  • 2217

【SQL】SQL語句撰写效能注意事項

一、问题的提出 在应用系统开发初期,由於开发资料库资料比较少,对於查询SQL语法,复杂视图的的编写等体会不出SQL语法各种写法的性能优劣, 但是如果将应用系统提交实际应用后,随著资料库中资料的增加...
  • tearsmo
  • tearsmo
  • 2012年05月16日 16:16
  • 845

mysql "net "不是内部命令或外部命令 ,也不是可运行的程序

很长时间不用mysql了,昨天晚上看struts2,做那个bbs小项目,用到了数据库,启动一下,在里面输入net start mysql,怎么都不好使 ,今天早上一顿百度,发现环境变量出问题了: 那是...
  • wangyang55555
  • wangyang55555
  • 2015年03月21日 08:03
  • 3357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET 内部效能插件
举报原因:
原因补充:

(最多只允许输入30个字)