在MATLAB中显示CPU核心利用率

时间:2014-09-20 16:10:49

标签: performance matlab user-interface cpu matlab-guide

无论如何(任何功能等)在我CPU cores utilization的{​​{1}}个MATLAB喜欢GUI中的Task Manager中显示{{1}}?

感谢。

1 个答案:

答案 0 :(得分:3)

据我所知,没有Matlab函数可以在进程使用级别访问系统属性。要获得此信息,必须调用外部类。

在互联网上搜索可以获取一些可以查询进程属性的 Java 类。 Java方法的优点是它更有可能是跨平台的。

对于Windows用户,仍然有两种查询这些信息的方法:通过直接调用windows API(更快,但在Matlab中使用相当复杂),以及使用.net对象(更慢,但是uber easy as Matlab几乎无缝地处理.net类。


  • 创建对象

我们需要告诉Matlab实例化System.Diagnostics.PerformanceCounter对象。对于示例/ 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使用情况是什么......很简单。

唯一需要注意的细节是,报告的数量仅适用于进程正在使用的处理器核心,因此如果您有多个核心,则报告的数量必须除以处理器总数获得整体数字。

   % 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太多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 ,您的显示器将最终占用大部分处理器时间(每个进程一个非常费力的例子)... 并且不要试图以疯狂的短间隔刷新你的计时器


  • 功能齐全的例子:

很抱歉,但90%只是为了gui机械师(我尽可能保持粗糙但仍然如此)所以我不会解释所有这些。唯一重要的部分是上面显示的片段(包含在下面的完整功能示例中)。

{{1}}