据我所知,没有可以在进程使用级别访问系统属性的 Matlab 函数。要获取此信息,必须调用外部类。
在 Internet 上搜索可以获取一些 Java 类,这些类可以查询进程属性。 Java 方法的优势在于它更可能是跨平台的。
对于windows用户来说,查询这些信息还有2种方式:直接调用windows API(速度更快,但在Matlab中放置相当复杂),以及使用.net对象(速度较慢,但超级简单)因为 Matlab 几乎可以无缝地处理 .net 类)。
我们需要告诉 Matlab 实例化一个System.Diagnostics.PerformanceCounter 对象。例如 /i 创建了两个这样的对象,一个查看 System Idle Process(称为 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,您的监视器最终会占用大部分处理器时间(每个进程一个进程会很费力)例如)... 也不要试图以疯狂的短时间间隔刷新你的计时器
抱歉,其中 90% 只是针对 gui 机制(我尽可能地保持粗略但仍然如此),所以我不会全部解释。唯一重要的位是上面显示的 sn-ps(包含在下面的完整功能示例中)。
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