注意:算法仅供参考。

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. HTTP缓存实现的原理

    浏览器是如何知道使用缓存的,其实这都是通过http中,浏览器将最后修改时间发送请求给web服务器,web服务器收到请求后跟服务器上的文档最后修改的时间对比,如果web服务器上最新文档修改时间小于或者等 ...

  2. [转载]javascript+ajax+jquery教程11--正则表达式

    原文地址:javascript+ajax+jquery教程11--正则表达式作者:morflame 正则表达式可以: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个 ...

  3. Andrew Ng机器学习编程作业:Regularized Linear Regression and Bias/Variance

    作业文件: machine-learning-ex5 1. 正则化线性回归 在本次练习的前半部分,我们将会正则化的线性回归模型来利用水库中水位的变化预测流出大坝的水量,后半部分我们对调试的学习算法进行 ...

  4. Python3+Selenium3自动化测试-(五)

    这里来说一说selenium中的等待方式,其实在webdriver只有两种类型等待方式,显式等待和隐式等待,之前是在程序运行过程中使用time模块中的sleep进行代码的休眠进行强制等待,是显式等待中 ...

  5. hadoop编程:分析CSDN注冊邮箱分布情况

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jdh99/article/details/37565825 hadoop编程:分析CSDN注冊邮箱分 ...

  6. 在 ReportViewer 报表中使用表达式

    from:http://www.cnblogs.com/jobin/articles/1152213.html 有些表达式在报表中很常用.其中包括更改报表中的数据外观的表达式.计算总数的表达式和更改报 ...

  7. unity,如何手动或者使用代码更换材质

    在unity中,我们可能需要更换怪物的贴图,来达到以下效果 方法1:手动配置 找到自己配置好的扩展名为.mat的文件,在怪物的节点找到带Mesh Render的子元素,将其拖放到如图位置 方法2:代码 ...

  8. springboot与redis的无缝整合(分布式)

    参考博客 : https://blog.csdn.net/csao204282/article/details/54092997 1 首先得引入依赖 <dependency> <gr ...

  9. Python3,x:如何进行手机APP的数据爬取

    Python3,x:如何进行手机APP的数据爬取 一.简介 平时我们的爬虫多是针对网页的,但是随着手机端APP应用数量的增多,相应的爬取需求也就越来越多,因此手机端APP的数据爬取对于一名爬虫工程师来 ...

  10. Docker与自动化测试及其测试实践

    Docker 与自动化测试 对于重复枯燥的手动测试任务,可以考虑将其进行自动化改造.自动化的成本在于自动化程序的编写和维护,而收益在于节省了手动执行用例的时间.简而言之,如果收益大于成本,测试任务就有 ...