注意:算法仅供参考。

cpuusage.cs

 using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading; namespace cpuusage
{
class Program
{
const string VERSION = "cpuusage v0.1.0";
static readonly Dictionary<string, PerformanceCounter> _caches = new Dictionary<string, PerformanceCounter>();
static string _format = "list";
static int _sleep = ;
static int _times = -;
static bool _pauseWhenFinish = false;
static StreamWriter _sw = null;
static bool _listProcessNames = false;
static bool _printUsage = false;
static bool _printVersion = false; static void Main(string[] args)
{
var processNames = GetProcessNamesAndParseArgs(args);
if (_printVersion)
{
PrintVersion();
}
if (_printUsage)
{
PrintUsage();
}
else if (_listProcessNames)
{
PrintProcessNames(processNames);
}
else
{
switch (_format)
{
case "table":
PrintToTable(processNames);
break;
case "csv":
PrintToCsv(processNames);
break;
case "list":
PrintToList(processNames);
break;
default:
Fault(, "ERROR: -f argument error");
break;
}
}
if (_pauseWhenFinish) {
Console.WriteLine();
Console.Write("Press any key to EXIT...");
Console.ReadKey(true);
}
if (_sw != null)
{
_sw.Close();
}
} static void Fault(int returnCode, string message)
{
Console.WriteLine(message);
if (_sw != null)
{
_sw.Close();
}
Environment.Exit(returnCode);
} static void PrintProcessNames(string[] processNames)
{
foreach (var name in processNames)
{
Output(string.Format("{0}{1}", name, Environment.NewLine));
}
} static void PrintToList(string[] processNames)
{
if (processNames == null || processNames.Length == )
{
return;
}
const string nameTitle = "Name";
const string cpuUsageTitle = "CPU Usage (%)";
var nameColumnMaxLength = Math.Max(processNames.Max(n => n.Length), nameTitle.Length);
var cpuUsageColumnMaxLength = cpuUsageTitle.Length;
var format = string.Format("{{0,-{0}}} {{1:0.##}}", nameColumnMaxLength);
var head = string.Format(format, nameTitle, cpuUsageTitle).ToUpper();
head += Environment.NewLine + string.Format(format, new string('-', nameColumnMaxLength), new string('-', cpuUsageColumnMaxLength));
var sb = new StringBuilder();
while (_times != )
{
sb.AppendLine(head);
foreach (var name in processNames)
{
try
{
sb.AppendFormat(format, name, GetProcessCpuUsage(name));
sb.AppendLine();
}
catch(Exception)
{
}
}
Output(sb.ToString());
sb.Clear();
if(_times > ) {
if (--_times == ) {
break;
}
}
Thread.Sleep(_sleep);
sb.AppendLine();
}
} static void PrintToTable(string[] processNames)
{
if (processNames == null || processNames.Length == )
{
return;
}
var sb = new StringBuilder();
var sb1 = new StringBuilder();
foreach (var name in processNames)
{
sb.AppendFormat("{0,-6} ", name);
sb1.AppendFormat("{0} ", new string('-', Math.Max(name.Length, )));
}
sb.Remove(sb.Length - , );
sb1.Remove(sb1.Length - , );
sb.AppendLine();
sb.Append(sb1.ToString());
sb.AppendLine();
var head = sb.ToString();
Output(head);
sb1 = null;
sb.Clear();
while (_times != )
{
for (int i = ; i < processNames.Length; i++)
{
var name = processNames[i];
var value = "";
try
{
value = GetProcessCpuUsage(name).ToString("0.00");
}
catch(Exception)
{
}
var length = Math.Max(name.Length, );
value = value.PadLeft(length);
if (i + != processNames.Length) {
value = string.Format("{0} ", value);
}
sb.Append(value);
}
Output(sb.ToString());
sb.Clear();
if(_times > ) {
if (--_times == ) {
break;
}
}
Thread.Sleep(_sleep);
sb.AppendLine();
}
} static void PrintToCsv(string[] processNames)
{
if (processNames == null || processNames.Length == )
{
return;
}
var sb = new StringBuilder();
foreach (var name in processNames)
{
var tempName = name.Replace("\"", "\"\"");
if (name.Contains(",") || name.Contains(" ") || name.Contains("\""))
{
tempName = string.Format("\"{0}\"", tempName);
}
sb.AppendFormat("{0},", tempName);
}
sb.Remove(sb.Length - , );
sb.AppendLine();
var head = sb.ToString();
Output(head);
sb.Clear();
while (_times != )
{
for (int i = ; i < processNames.Length; i++)
{
var name = processNames[i];
var value = "";
try
{
value = GetProcessCpuUsage(name).ToString("0.00");
}
catch(Exception)
{
}
if (i + != processNames.Length)
{
value = string.Format("{0},", value);
}
sb.Append(value);
}
Output(sb.ToString());
sb.Clear();
if(_times > ) {
if (--_times == ) {
break;
}
}
Thread.Sleep(_sleep);
sb.AppendLine();
}
} static string[] GetProcessNamesAndParseArgs(string[] args)
{
if (args.Any(n => n.ToLower() == "-v"))
{
_printVersion = true;
}
if (args.Length == || args.Any(n => n.ToLower() == "-h"))
{
_printUsage = true;
_printVersion = true;
_pauseWhenFinish = true;
return null;
}
_pauseWhenFinish = args.Any(n => n.ToLower() == "-p");
if (args.Any(n => n.ToLower() == "-l"))
{
_listProcessNames = true;
}
var arg = args.FirstOrDefault(n => n.ToLower().StartsWith("-f:"));
if (arg != null) {
_format = arg.Substring().ToLower();
}
arg = args.FirstOrDefault(n => n.ToLower().StartsWith("-s"));
if (arg != null) {
int s;
if (int.TryParse(arg.Substring(), out s)) {
_sleep = s;
}
}
arg = args.FirstOrDefault(n => n.ToLower().StartsWith("-t"));
if (arg != null) {
int t;
if (int.TryParse(arg.Substring(), out t)) {
_times = t;
}
}
arg = args.FirstOrDefault(n => n.ToLower().StartsWith("-o:"));
if (arg != null) {
var output = arg.Substring().ToLower();
try
{
_sw = File.CreateText(output);
}
catch(Exception ex)
{
if (_sw != null)
{
_sw.Close();
}
_sw = null;
Fault(, string.Format("ERROR: {0}", ex.Message));
}
} if (args.Contains("*"))
{
return Process.GetProcesses().Select(n => n.ProcessName).OrderBy(n => n).Distinct().ToArray();
} var r = args.Where(n => !n.StartsWith("-")).Select(n => GetFriendlyName(n)).ToArray();
if (_listProcessNames && r.Length == )
{
return Process.GetProcesses().Select(n => n.ProcessName).OrderBy(n => n).Distinct().ToArray();
}
return r;
} static void Output(string message)
{
Console.Write(message);
if (_sw == null)
{
return;
}
try
{
_sw.Write(message);
_sw.Flush();
}
catch (Exception)
{
_sw.Close();
_sw = null;
}
} static void PrintUsage()
{
var n = Path.GetFileName(Environment.GetCommandLineArgs()[]);
var n1 = Path.GetFileNameWithoutExtension(n);
Console.Write("Usage:{2} {0} [-f:<list|table|csv>] [-s<milliseconds>] [-t<times>] [-o:<filename>] [-p] <instance_names|*>{2} {0} -l [-o:<filename>] [-p] [<instance_names|*>]{2} -f output format, default to list.{2} -s sleep millisenconds, default to 1000.{2} -t times, default to forever.{2} -p pause when out of times.{2} -o output to file.{2} -l print name of processes only.{2} -h print help.{2} -v print version.{2}{2}Example:{2} {0} _Total Idle System Svchost {1}{2} {0} *{2} {0} * -f:csv -s200 -t10 > 1.csv{2} {0} -f:csv -s200 -t10 chrome firefox -o:2.csv{2}", n, n1, Environment.NewLine);
} static void PrintVersion()
{
Console.WriteLine(VERSION);
} static string GetFriendlyName(string instanceName)
{
var r = new StringBuilder(instanceName);
for(int i=; i<r.Length; i++)
{
var ch = r[i];
if (ch=='(')
{
r[i] = '[';
continue;
}
if (ch==')')
{
r[i] = ']';
continue;
}
if (ch=='#' || ch=='\\' || ch== '/')
{
r[i] = '_';
continue;
}
}
return r.ToString();
} static float GetProcessCpuUsage(string instanceName)
{
// var total = GetPerformanceCounter("_Total").NextValue();
var value = GetPerformanceCounter(instanceName).NextValue();
return value / Environment.ProcessorCount;
} static PerformanceCounter GetPerformanceCounter(string instanceName)
{
PerformanceCounter r;
if (_caches.TryGetValue(instanceName, out r))
{
return r;
}
r = new PerformanceCounter("Process", "% Processor Time", instanceName);
_caches[instanceName] = r;
return r;
} }
}

build.bat

 @echo off
pushd "%~dp0"
set csfile=cpuusage.cs
set PATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\bin\Roslyn";"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\bin\Roslyn";"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\bin\Roslyn";"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64";"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN";C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319;C:\WINDOWS\Microsoft.NET\Framework64\v3.5;C:\WINDOWS\Microsoft.NET\Framework64\v2.0;%PATH%
csc.exe /target:exe /unsafe+ %csfile%
if ERRORLEVEL 1 (echo ERROR: %ERRORLEVEL%) else (echo Build Success)
echo.
echo Press any key to EXIT...
pause>nul
popd

测试:将全部进程10秒中内的CPU使用率导出到CSV,然后查看图表(排除idle和cpuusage)。

C:\> cpuusage -t10 -s1000 -f:csv * > 1.csv

CPU Usage (C#) 测试的更多相关文章

  1. CPU利用率和CPU负荷(CPU usage vs CPU load)

    对于CPU的性能监测,通常用top指令能显示出两个指标:cpu 利用率和cpu负荷. 其中%Cpu相关的内容: us表示用户进程cpu利用率,sy表示系统内核进程cpu利用率,ni表示运行正常进程消耗 ...

  2. Unity Profiler CPU Usage(CPU使用情况)

    在Profiler界面点击左侧CPU Usage,Profiler界面下方Hierarchy窗口会列出各个函数对当前CPU的耗时,从大到小排序. 然后分析,各个函数的耗时是否异常,分析有没有可以优化的 ...

  3. How to Limit NodeRunner.exe High Memory, CPU Usage

    roblem: NodeRunner.exe is consuming a lot of memory and CPU resulted in performance issues on ShareP ...

  4. Docker CPU Usage

    背景 当一台机器上跑有多个 Docker Container 的时候,我们需要知道,哪些容器占用了多少资源.采集这些指标,来让我们可以更加好的分配资源给每个 Container. 获取容器CPU使用率 ...

  5. Docker容器CPU限制选项测试

    目录 Docker容器CPU限制选项测试 参考 实验环境 --cpu-shares选项 测试 结论 --cpus选项 测试 结论 --cpuset-cpus选项 测试 结论 Docker容器CPU限制 ...

  6. C++第四十二篇 -- CPU Usage

    前言 目的:读取并控制CPU占用率 近期在做CPU Usage方面的事情,让CPU以一种高占用率的状态运行一定的时间,需要读取CPU各个核的占用率,网上关于这方面的资料好少,FQ也只找到了一个WMI的 ...

  7. 【DPDK】【CPU usage】DPDK应用如何计算当前系统的压力

    [前言] 使用DPDK开发的朋友应该都了解使用dpdk的fwd线程的工作模式是polling模式,即100%轮询的方式去加速网络IO,这样我们在操作系统层面上来观察目标processer会发现usag ...

  8. 关于CPU亲和性的测试

    今天看到运维的同事在配置nginx的CPU亲和性时候,运维同事说他在所有的机器上都是按照8核的方式来配置worker进程的CPU亲和性的. 但我觉得就是有点不太对劲,就查了一下nginx的处理work ...

  9. CPU特性漏洞测试(Meltdown and Spectre)

    2018年1月4日,国外安全研究人员披露了名为"Meltdown"和"Spectre"两组CPU特性漏洞,该漏洞波及到近20年的Intel, AMD, Qual ...

随机推荐

  1. New Moto X 2014 全版本官方解锁Bootloader图文教程

    ]秒后松开,手机就会进入fastboot模式. 如下图: <ignore_js_op> 接下来,手机连接电脑,打开刚刚的fastboot工具里面的命令提示符: <ignore_js_ ...

  2. QT Creator常用快捷键

    1.F10,F11 单步调试 2.Ctrl + / :注释/取消注释选定内容. 3.F4 :在 头文件(.h) 和 实现文件(.cpp) 之间进行切换. 4.Ctrl + i :自动格式化选中代码. ...

  3. PAT 1095 Cars on Campus

    1095 Cars on Campus (30 分) Zhejiang University has 8 campuses and a lot of gates. From each gate we ...

  4. Flash本地共享对象 SharedObject

    以下内容是对网上一些资料的总结 Flex SharedObject 介绍(转自http://www.eb163.com/club/thread-3235-1-1.html): Flash的本地共享对象 ...

  5. bootstrap基本使用

    bootstrap是封装了css和js代码实现酷炫的效果,所以使用的时候,比如说是列表效果,直接调用它本身定义的函数就ok了 静态文件 把href='..static/..'里面改为url_for静态 ...

  6. java二叉排序树

    二叉排序树又称二叉查找树.它或者是一颗空树,或者是具有如下性质的二叉树: 1.如果左子树不空,那么左子树上的所有节点均小于它的根节点的值: 2.如果右子树不空,那么右子树上的所有节点均大于它的根节点的 ...

  7. C# 复杂算法

    1.添加命名空间引用using Microsoft.JScript; //formula 是公式如:(1+2)*3/10 private double GetComputeValueByStringF ...

  8. 登录用户执行sudo时报错

    场景: 以普通用户登录,登陆后切换至root或其他用户时报错(sudo su -或sudo -i) 报错信息: -bash: /bin/logger: Argument list too long 根 ...

  9. 如何编写自己的虚拟DOM

    要构建自己的虚拟DOM,需要知道两件事.你甚至不需要深入 React 的源代码或者深入任何其他虚拟DOM实现的源代码,因为它们是如此庞大和复杂--但实际上,虚拟DOM的主要部分只需不到50行代码. 有 ...

  10. 程序包com.sun.istack.internal不存在

    添加一下依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency> ...