2014-05-24 5 views
1

J'essaie de mieux comprendre Win32::PerfLib, et je ne dois pas utiliser Win32::PerfMon. Deux exemple, j'ai des questions sur:Perl en utilisant Win32 :: PerfLib

premier exemple, est le classique de 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} 
        ); 
      } 
     } 
    } 

Quelqu'un pourrait-il expliquer en profondeur la ligne 4? Je ne comprenais pas pourquoi nous utilisons $ _ pour et ce qu'il représente, bien que j'aie lu à ce sujet mais dans ce cas je ne sais pas. En outre quel est le sens $counter{$_} => $_? question

La deuxième est de ce code, qui obtient le cpu% de perfmon:

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}; 
    } 
    } 
} 

Pourquoi le programmeur a utiliser la méthode « GetObjectList » Deux fois et mettre la méthode de sommeil entre eux? Et pourquoi nous ne pouvons pas simplement prendre le cpu pour cent comme perfmon montre et nous devons faire tous ces calculs? Merci d'avance, Fam Pam.

+0

Vous avez deux questions. S'il vous plaît créer des questions distinctes. – user1126070

Répondre

0

Dans ce code:

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

Vous êtes stroing la perfdata en% hachage contre. La carte dans ce cas crée un hachage inverse où les valeurs antérieures deviennent des clés.

Exemple:

from apple => 'fruit' to fruit => 'apple 
Questions connexes