gpt4 book ai didi

performance - 在 MATLAB 中显示 CPU 内核利用率

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:31 51 4
gpt4 key购买 nike

无论如何(任何函数等)在 MATLAB 中显示 CPU 内核利用率GUI 中,就像我们在 Task 中一样Windows 的管理器(性能选项卡)?

谢谢。

最佳答案

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

在 Internet 上搜索可以找到一些可以查询进程属性的 Java 类。 Java 方法的优点是它更可能是跨平台的。

对于windows用户,仍然有两种查询这些信息的方法:直接调用windows API(速度更快,但在Matlab中实现起来相当复杂),以及使用.net对象(速度较慢,但​​ super 简单,因为 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% 仅用于图形用户界面机制(我尽可能粗略地保留了这一点,但仍然如此)所以我不会解释所有内容。唯一重要的部分是上面显示的片段(包含在下面的完整功能示例中)。

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

关于performance - 在 MATLAB 中显示 CPU 内核利用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25950727/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com