2014-05-24 22 views
1

我試圖理解Win32::PerfLib更好,我不能使用Win32::PerfMon。 兩個例子我有問題:Perl使用Win32 :: PerfLib

第一個例子,是從CPAN經典:

use Win32::PerfLib; 
    my $server = "";`enter code here` 
    Win32::PerfLib::GetCounterNames($server, \%counter); 
    %r_counter = map { $counter{$_} => $_ } keys %counter; 
    # retrieve the id for process object 
    $process_obj = $r_counter{Process}; 
    # retrieve the id for the process ID counter 
    $process_id = $r_counter{'ID Process'}; 

    # create connection to $server 
    $perflib = new Win32::PerfLib($server); 
    $proc_ref = {}; 
    # get the performance data for the process object 
    $perflib->GetObjectList($process_obj, $proc_ref); 
    $perflib->Close(); 
    $instance_ref = $proc_ref->{Objects}->{$process_obj}->{Instances}; 
    foreach $p (sort keys %{$instance_ref}) 
    { 
     $counter_ref = $instance_ref->{$p}->{Counters}; 
     foreach $i (keys %{$counter_ref}) 
     { 
      if($counter_ref->{$i}->{CounterNameTitleIndex} == $process_id) 
      { 
       printf("% 6d %s\n", $counter_ref->{$i}->{Counter}, 
         $instance_ref->{$p}->{Name} 
        ); 
      } 
     } 
    } 

有人能深入解釋4號線? 我不明白我們爲什麼使用$ _和 它代表的是什麼,雖然我讀了它 但在這種情況下,我不知道。另外 $counter{$_} => $_是什麼意思?

第二個問題,從這個代碼,它從性能監視器獲取CPU% :

use Win32::PerfLib; 
($server) = @ARGV; 
# only needed for PrintHash subroutine 
#Win32::PerfLib::GetCounterNames($server, \%counter); 

$processor = 238; 
$proctime = 6; 

$perflib = new Win32::PerfLib($server); 
$proc_ref0 = {}; 
$proc_ref1 = {}; 
$perflib->GetObjectList($processor, $proc_ref0); 
sleep 5; 
$perflib->GetObjectList($processor, $proc_ref1); 
$perflib->Close(); 
$instance_ref0 = $proc_ref0->{Objects}->{$processor}->{Instances}; 
$instance_ref1 = $proc_ref1->{Objects}->{$processor}->{Instances}; 
foreach $p (keys %{$instance_ref0}) 
{ 
    $counter_ref0 = $instance_ref0->{$p}->{Counters}; 
    $counter_ref1 = $instance_ref1->{$p}->{Counters}; 
    foreach $i (keys %{$counter_ref0}) 
    { 
    next if $instance_ref0->{$p}->{Name} eq "_Total"; 
    if($counter_ref0->{$i}->{CounterNameTitleIndex} == $proctime) 
    { 
     $Numerator0 = $counter_ref0->{$i}->{Counter}; 
     $Denominator0 = $proc_ref0->{PerfTime100nSec}; 
     $Numerator1 = $counter_ref1->{$i}->{Counter}; 
     $Denominator1 = $proc_ref1->{PerfTime100nSec}; 
     $proc_time{$p} = (1- (($Numerator1 - $Numerator0)/
        ($Denominator1 - $Denominator0))) * 100; 
     printf "Instance $p: %.2f\%\n", $proc_time{$p}; 
    } 
    } 
} 

爲什麼程序員不得不使用方法「GetObjectList」 兩次,並把他們的睡眠方法? 爲什麼我們不能只考慮像perfmon這樣的CPU百分比顯示 ,我們必須做出所有這些計算?

在此先感謝, Fam Pam。

+0

你有兩個問題。請創建一個單獨的問題。 – user1126070

回答

0

在此代碼:

Win32::PerfLib::GetCounterNames($server, \%counter); 
    %r_counter = map { $counter{$_} => $_ } keys %counter; 

您是stroing在櫃檯%哈希perfdata。在這種情況下,映射會創建一個反向散列,其中較早的值成爲鍵。

例子:

from apple => 'fruit' to fruit => 'apple 
相關問題