【问题标题】:Show CPU cores utilization in MATLAB在 MATLAB 中显示 CPU 内核利用率
【发布时间】:2014-09-20 16:10:49
【问题描述】:

无论如何(任何功能等)在MATLAB 中显示CPU cores utilizationGUI 喜欢我们在Task Manager 的窗口(性能选项卡)?

谢谢。

【问题讨论】:

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

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


【解决方案1】:

据我所知,没有可以在进程使用级别访问系统属性的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2017-09-25
    相关资源
    最近更新 更多