据我所知,没有任何 Matlab 函数可以在进程使用级别访问系统属性。要获取此信息,必须调用外部类。
在互联网上搜索可以找到一些Java可以查询流程属性的类。 Java 方法的优点是它更可能是跨平台的。
对于 Windows 用户,仍然有 2 种方式查询这些信息:直接调用 Windows API(速度更快,但在 Matlab 中实现起来相当复杂),以及使用.net
object(速度较慢,但非常简单,因为 Matlab 几乎无缝地处理 .net 类)。
我们需要告诉 Matlab 实例化一个系统.诊断.性能计数器目的。对于示例 /i 创建其中两个对象,其中一个查看系统空闲进程(称为Idle
)和一个着眼于Matlab进程(该进程将报告 Matlab CPU 使用情况)。
function mon = createMonitor
MatlabProcess = System.Diagnostics.Process.GetCurrentProcess(); % "Matlab" process
cpuIdleProcess = 'Idle' ;
mon.NumOfCPU = double(System.Environment.ProcessorCount);
mon.ProcPerfCounter.Matlab = System.Diagnostics.PerformanceCounter('Process', '% Processor Time', MatlabProcess.ProcessName );
mon.ProcPerfCounter.cpuIdle = System.Diagnostics.PerformanceCounter('Process', '% Processor Time', cpuIdleProcess );
end
使用 Windows API,我们必须自己进行大量机器周期计算,但是这些 .net 对象很简洁,因为它们为您完成了所有这些工作(尽管以性能为代价)。所以现在只需调用该对象并询问最后一次 CPU 使用情况是多少......很简单。
唯一需要关心的细节是,报告的数量仅适用于进程正在使用的处理器核心,因此如果您有多个核心,则报告的数量必须除以处理器总数才能得到overall figure.
% Calculate the cpu usage
cpu.total = 100 - h.mon.ProcPerfCounter.cpuIdle.NextValue / h.mon.NumOfCPU ;
cpu.matlab = h.mon.ProcPerfCounter.Matlab.NextValue / h.mon.NumOfCPU ;
就这样吧。最困难的部分是了解并访问这些.net
微妙之处。现在,如果您想要一个真正的监视器,您需要定义一个计时器,它将定期调用这些方法,然后显示结果。
请注意,调用这些.net
对象在处理器时间上非常昂贵,因此如果创建太多PerformanceCounter
您的显示器最终将占用大部分处理器时间(例如,每个进程一个显示器会非常费力)...并且也不要尝试以疯狂的短间隔刷新计时器
抱歉,90% 的内容只是用于 GUI 机制(我尽可能保持粗糙,但仍然如此),所以我不会解释所有内容。唯一重要的部分是上面显示的片段(它们包含在下面的完整功能示例中)。
function hcol = CPU_monitor
h = create_gui ;
end
function mon = createMonitor
MatlabProcess = System.Diagnostics.Process.GetCurrentProcess(); %// "Matlab" process
cpuIdleProcess = 'Idle' ;
mon.NumOfCPU = double(System.Environment.ProcessorCount);
mon.ProcPerfCounter.Matlab = System.Diagnostics.PerformanceCounter('Process', '% Processor Time', MatlabProcess.ProcessName );
mon.ProcPerfCounter.cpuIdle = System.Diagnostics.PerformanceCounter('Process', '% Processor Time', cpuIdleProcess );
end
function updateMeasure(obj,evt,hfig)
h = guidata(hfig) ;
%// Calculate the cpu usage
cpu.total = 100 - h.mon.ProcPerfCounter.cpuIdle.NextValue / h.mon.NumOfCPU ;
cpu.matlab = h.mon.ProcPerfCounter.Matlab.NextValue / h.mon.NumOfCPU ;
%// update the display
set(h.txtTotalCPU,'String',num2str(cpu.total,'%5.2f %%') )
set(h.txtMatlabCPU,'String',num2str(cpu.matlab,'%5.2f %%') )
end
function StartMonitor(obj,evt)
h = guidata(obj) ;
start(h.t)
end
function StopMonitor(obj,evt)
h = guidata(obj) ;
stop(h.t)
end
function h = create_gui %// The boring part
h.fig = figure('Unit','Pixels','Position',[200 800 240 120],'MenuBar','none','Name','CPU usage %','NumberTitle','off') ;
h.btnStart = uicontrol('Callback',@StartMonitor,'Position',[10 80 100 30],'String', 'START' );
h.btnStart = uicontrol('Callback',@StopMonitor,'Position',[130 80 100 30 ],'String', 'STOP' );
h.lbl1 = uicontrol('HorizontalAlignment','right','Position',[10 50 100 20],'String','TOTAL :','Style','text' );
h.txtTotalCPU = uicontrol('Position',[130 50 100 20],'String','0','Style','text' ) ;
h.lbl2 = uicontrol('HorizontalAlignment','right','Position',[10 10 100 20],'String','Matlab :','Style','text' );
h.txtMatlabCPU = uicontrol('Position',[130 10 100 20],'String','0','Style','text' ) ;
movegui(h.fig,'center')
%// create the monitor
h.mon = createMonitor ;
%// Create the timer
h.t = timer;
h.t.Period = 1;
h.t.ExecutionMode = 'fixedRate';
h.t.TimerFcn = {@updateMeasure,h.fig} ;
h.t.TasksToExecute = Inf;
%// store the handle collection
guidata(h.fig,h)
end