Performance 在MATLAB中显示CPU内核利用率

Performance 在MATLAB中显示CPU内核利用率,performance,matlab,user-interface,cpu,matlab-guide,Performance,Matlab,User Interface,Cpu,Matlab Guide,在MATLAB的GUI中显示CPU内核利用率(任何函数等)是否与windows(性能选项卡)的Task Manager类似 谢谢。据我所知,没有Matlab函数可以访问进程使用级别的系统属性。要获取此信息,必须调用外部类 internet上的搜索可以获取一些Java类,这些类可以查询进程属性。Java方法的优势在于它更可能是跨平台的 对于windows用户来说,仍然有两种查询这些信息的方法:直接调用windows API(速度更快,但在Matlab中使用起来相当复杂),以及使用.net对象(速度

MATLAB
GUI
中显示
CPU内核利用率(任何函数等)是否与windows(性能选项卡)的
Task Manager
类似


谢谢。

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

internet上的搜索可以获取一些Java类,这些类可以查询进程属性。Java方法的优势在于它更可能是跨平台的

对于windows用户来说,仍然有两种查询这些信息的方法:直接调用windows API(速度更快,但在Matlab中使用起来相当复杂),以及使用
.net
对象(速度较慢,但更容易,因为Matlab几乎无缝地处理.net类)


  • 创建对象
我们需要告诉Matlab实例化一个对象。对于示例/i,我创建了其中两个对象,一个用于查看系统空闲进程(称为
Idle
),另一个用于查看Matlab进程(此对象将报告Matlab CPU使用情况)


  • 查询对象
有了windows API,我们必须自己进行大量的机器周期计算,但这些.net对象很整洁,因为它们可以为您完成所有这些工作(但要以性能为代价)。所以现在只需调用对象并询问上次CPU使用情况。。。简单

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


  • 展示
好了。最困难的部分是了解和访问这些
.net
微妙之处。现在,如果您想要一个真正的监视器,您需要定义一个计时器,它将以固定的间隔调用这些方法,然后显示结果

请注意,调用这些
.net
对象在处理器时间上非常昂贵,因此如果创建太多
PerformanceCounter
,您的监视器将占用大部分处理器时间(例如,每个进程一个将非常费力)。。。也不要试图以极短的时间间隔刷新计时器


  • 全功能示例:
很抱歉,90%的内容只是为了gui机制(我尽可能粗略地保留了它,但仍然如此),所以我不会全部解释。唯一重要的是上面显示的代码片段(包含在下面的完整功能示例中)


您想要Windows、Unix、。。。还是跨平台解决方案?我正在windows平台上运行我的
GUI
。如果可以,请描述windows和跨平台的解决方案。谢谢。很抱歉,现在我使用的是windows 8,我似乎无法恢复旧的跨平台解决方案。它涉及一些
Java
类。仍然有一个仅适用于windows的有效解决方案,但它严重依赖于从matlab调用的
.net
类(除了显示部分外,很少使用本机matlab)。稍后我将尝试起草一个示例。
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
   % 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 ;
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