注意:算法仅供参考。

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. django博客项目7

    ................

  2. pandas数据结构和介绍第一天

    pandans另种主要的数据结构Series和DateFranme 1,Series 仅由一组数据就而已产生简单的Series 2)Series 有index和values属性,表达索引对象 3)设置 ...

  3. Flask(1)- 主流web框架、初识flask

    一.Python 现阶段三大主流Web框架 Django.Tornado.Flask 对比 Django 主要特点是大而全,集成了很多组件(例如Models.Admin.Form等等), 不管你用得到 ...

  4. sql 基础查询集锦

    授权 GRANT All ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED ...

  5. docker安装升级linux内核(2.6.32->3.10.81)

    .内核升级环境准备 #查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库: yum grouplist #一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具 y ...

  6. ZeroMQ作者于昨天下午宣布选择安乐死

    … printf("goodbye, world !");

  7. Tornado介绍与其Web应用结构

    1.介绍 tornado是一个Python web框架和异步网络库 起初由 FriendFeed 开发. 通过使用非阻塞网络I/O, Tornado 可以支持上万级的连接,处理 长连接, WebSoc ...

  8. Hbase 学习笔记3----操作以及维护

    一,基本命令: 建表:create 'table','t1','t2'       也可以建表时加coulmn的属性如:create 'table',{NAME => 't1', BLOOMFI ...

  9. 人性化的Form(django)

    django中的Form一般有两种功能: 输入html 验证用户输入 html: <!DOCTYPE html> <html lang="en"> < ...

  10. PAT 天梯赛 L1-021. 重要的话说三遍 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-021 AC代码 #include <iostream> #include <cstdio&g ...