2014-09-20 121 views
1

反正(任何函數等)來顯示MATLABCPU cores utilizationGUI喜歡,我們在窗口(性能選項卡)的Task Manager顯示CPU核心的利用率在MATLAB

謝謝。

+0

您想要Windows,Unix,或者跨平臺解決方案嗎? – Hoki 2014-09-20 16:52:06

+0

我在Windows平臺上運行我的'GUI'。如果可以,請在Windows和跨平臺上描述解決方案。謝謝。 – user2991243 2014-09-20 16:55:09

+0

對不起,我現在在Windows 8我似乎無法恢復我的舊的跨平臺解決方案。它涉及一些'Java'類。對於windows,仍然有一個工作解決方案,但它很大程度上依賴於從ma​​tlab中調用的'.net'類(很少是原生matlab,除了顯示部分)。我會盡力在稍後草擬一個例子。 – Hoki 2014-09-20 17:48:59

回答

3

據我所知,沒有Matlab函數可以在進程使用級別訪問系統屬性。要獲得這些信息,必須調用外部類。

在互聯網上的搜索可以取你一些Java類可以查詢進程屬性。 Java方法的優勢在於它更可能是跨平臺的。對於windows用戶,仍然有2種查詢這些信息的方式:通過直接調用windows API(更快,但在Matlab中放置相當複雜),並且使用.net對象(雖然速度較慢,但​​卻非常容易Matlab處理.net類幾乎無縫)。


  • 創建對象

我們需要告訴MATLAB實例化一個System.Diagnostics.PerformanceCounter對象。舉例來說,我創建了兩個這樣的對象,其中一個看起來是系統空閒進程(叫做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