Schrift
[thread]7548[/thread]

Hash als Option missbrauchen (Seite 4)

Leser: 1


<< |< 1 2 3 4 5 6 7 ... 12 >| >> 119 Einträge, 12 Seiten
bloonix
 2005-12-19 19:27
#60989 #60989
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=esskar,19.12.2005, 18:09]@pq: poste mal deine benchmarks :p[/quote]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
my @array = (1,2,3,4,5);

Benchmark::cmpthese(-1, {
        '& 1'        =>  sub { my $val = 1 if @array & 1; },
        'modulo 2'   =>  sub { my $val = 1 if @array % 2; },
});

             Rate modulo 2      & 1
modulo 2 3113701/s       --      -9%
& 1      3429921/s      10%       --


war zwar nur ein Scherz und auch nicht an mich gerichtet, ich war aber
trotzdem so frei ...
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2005-12-19 19:58
#60990 #60990
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=esskar,19.12.2005, 18:09]@pq: poste mal deine benchmarks :p[/quote]
zu spät =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
esskar
 2005-12-20 13:23
#60991 #60991
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=opi,19.12.2005, 18:27]
Code: (dl )
1
2
3
              Rate modulo 2      & 1
modulo 2 3113701/s       --      -9%
& 1      3429921/s      10%       --


war zwar nur ein Scherz und auch nicht an mich gerichtet, ich war aber
trotzdem so frei ...[/quote]
was hast du denn für eine Kiste ?

Code: (dl )
1
2
3
              Rate modulo 2      & 1
modulo 2 1738355/s -- -13%
& 1 1994659/s 15% --


Athlon XP 1700+
steffenw
 2005-12-20 13:54
#60992 #60992
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Die foreach-Schleife ist doch völlig für'n Schrubber. Man nimmt doch einen Hash, weil man zugreifen kann und eben nicht wie in einem Array suchen muß. Das ist doch wesentlich performanter und auch viel leichter lesbar.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my $stats = Statistics(
 ProcStats => 1,
 MemStats => 1,
 NetStats => 1,
 DiskStats => 1,
 DiskUsage => 1,
);

sub Statistics {
 my %param = @_;
 my %stats;
 if ($param{ProcStats}) {
   $stats{ProcStats} = ProcStats();
 } elsif ($param{NetStats}) {
   $stats{NetStats} = NetStats();
 } # usw ...
 return \%stats;
}


Wenn man die 1 nicht will, reicht auch undef. Dann wird nicht extra Speicher allociert, nur um da eine 1 hineinzupacken. Entweder macht man Parameterübergabe mit benannten Parametern wie oben oder schreibt die Optionen einfach nur hin.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $stats = Statistics(qw/ProcStats MemStats NetStats DiskStats DiskUsage/);

sub Statistics {
 my %param = map +($_ => undef), @_;
 my %stats;
 if (exists $param{ProcStats}) {
   $stats{ProcStats} = ProcStats();
 } elsif (exits $param{NetStats}) {
   $stats{NetStats} = NetStats();
 } # usw ...
 return \%stats;
}

Außerdem möchte ich auf das Modul Params::Validate hinweisen.\n\n

<!--EDIT|steffenw|1135079890-->
$SIG{USER} = sub {love 'Perl' or die};
esskar
 2005-12-20 14:11
#60993 #60993
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=steffenw,20.12.2005, 12:54]Die foreach-Schleife ist doch völlig für'n Schrubber.[/quote]
meinst du meine ?
das ist doch quatsch.
mit deinen vielen if-else anweisungen bricht man sich doch die Hände. So kann man sehr schnell neue Parameter dazu tun und wertet noch dazu auch nur die Parameter aus, die wohl definiert sind.
steffenw
 2005-12-20 14:21
#60994 #60994
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nein, ich hatte auf den allerersten Beitrag geantwortet. Das war Hashzugriff und foreach zusammen drin. Dein Beitrag, der dritte, geht davon aus, daß sie Sub und der Parameter gleich heißen. Wenn das so ist, dann ist das gut so. Ansonsten bleibt doch nur elsif übrig oder man legt die Subreferenzen in den Hash, wenn man keine symbolischen Referenzen will.\n\n

<!--EDIT|steffenw|1135081323-->
$SIG{USER} = sub {love 'Perl' or die};
bloonix
 2005-12-20 19:06
#60995 #60995
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=esskar,20.12.2005, 12:23][quote=opi,19.12.2005, 18:27]
Code: (dl )
1
2
3
              Rate modulo 2      & 1
modulo 2 3113701/s       --      -9%
& 1      3429921/s      10%       --


war zwar nur ein Scherz und auch nicht an mich gerichtet, ich war aber
trotzdem so frei ...[/quote]
was hast du denn für eine Kiste ?

Code: (dl )
1
2
3
              Rate modulo 2      & 1
modulo 2 1738355/s       --     -13%
& 1      1994659/s      15%       --


Athlon XP 1700+[/quote]
nur ein Notebook... HP Pavilion zd8000 mit P-IV 3GHz Prozessor.

seit dem ich das Ding hab, ist mein Compi out ;-)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2005-12-20 19:15
#60996 #60996
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=steffenw,20.12.2005, 13:21]Nein, ich hatte auf den allerersten Beitrag geantwortet. Das war Hashzugriff und foreach zusammen drin. Dein Beitrag, der dritte, geht davon aus, daß sie Sub und der Parameter gleich heißen. Wenn das so ist, dann ist das gut so. Ansonsten bleibt doch nur elsif übrig oder man legt die Subreferenzen in den Hash, wenn man keine symbolischen Referenzen will.[/quote]
du hast natürlich Recht. Ich habe das Ganze nun so realisiert...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
sub Statistics {

  my %param;

  if (ref $_[0] eq 'HASH') {
     %param = %{$_[0]};
  }
  elsif (@_ & 1) {
     die 'LinuxStatistics: not enough arguments ...';
  }
  else {
     %param = @_;
  }

  my $t_stats = {};
  my $stats   = {};

  # set a time stamp for the statistics

  if ($param{TimePoint}) {
     my @tm = localtime(time);

     $tm[4] += 1;
     $tm[5] += 1900;

     foreach (@tm) {
        $_ = "0$_" if $_ < 10;
     }

     $stats->{TimePoint}->{Date} = "$tm[5]-$tm[4]-$tm[3]";
     $stats->{TimePoint}->{Time} = "$tm[2]:$tm[1]:$tm[0]";
  }

  # get the statistics

  $stats->{SysInfo}     = SysInfo()   if $param{SysInfo};
  $stats->{MemStats}    = MemStats()  if $param{MemStats};
  $stats->{SockStats}   = SockStats() if $param{SockStats};
  $stats->{DiskUsage}   = DiskUsage() if $param{DiskUsage};
  $stats->{LoadAVG}     = LoadAVG()   if $param{LoadAVG};
  $stats->{Processes}   = Processes() if $param{Processes};

  # some statistics must run twice because the differences are needed

  $t_stats->{ProcStats} = ProcStats() if $param{ProcStats};
  $t_stats->{PgSwStats} = PgSwStats() if $param{PgSwStats};

  ($t_stats->{NetStats},$t_stats->{NetSumStats})   = NetStats()  if $param{NetStats};
  ($t_stats->{DiskStats},$t_stats->{DiskSumStats}) = DiskStats() if $param{DiskStats};

  # wait a second until the next step

  sleep(1) if %{$t_stats};

  # now we calculate the difference

  if ($param{ProcStats}) {
     $stats->{ProcStats} = ProcStats();

     foreach my $x (keys %{$stats->{ProcStats}}) {
        $stats->{ProcStats}->{$x} -= $t_stats->{ProcStats}->{$x};
     }

     $stats->{ProcStats}->{ProcUser}   =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcUser} / $stats->{ProcStats}->{Uptime});
     $stats->{ProcStats}->{ProcNice}   =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcNice} / $stats->{ProcStats}->{Uptime});
     $stats->{ProcStats}->{ProcSystem} =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcSystem} / $stats->{ProcStats}->{Uptime});
     $stats->{ProcStats}->{ProcIdle}   =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcIdle} / $stats->{ProcStats}->{Uptime});
     $stats->{ProcStats}->{ProcIOWait} =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcIOWait} / $stats->{ProcStats}->{Uptime});
     $stats->{ProcStats}->{ProcTotal}  =  $stats->{ProcStats}->{ProcUser} + $stats->{ProcStats}->{ProcNice} + $stats->{ProcStats}->{ProcSystem};

     delete $stats->{ProcStats}->{Uptime};
  }

  if ($param{PgSwStats}) {
     $stats->{PgSwStats} = PgSwStats();

     foreach my $x (keys %{$stats->{PgSwStats}}) {
        $stats->{PgSwStats}->{$x} -= $t_stats->{PgSwStats}->{$x};
     }
  }

  if ($param{NetStats}) {
     ($stats->{NetStats},$stats->{NetSumStats}) = NetStats();

     foreach my $x (keys %{$stats->{NetStats}}) {
        foreach my $y (keys %{$stats->{NetStats}->{$x}}) {
           $stats->{NetStats}->{$x}->{$y} -= $t_stats->{NetStats}->{$x}->{$y};
        }
     }

     foreach my $x (keys %{$stats->{NetSumStats}}) {
        $stats->{NetSumStats}->{$x} -= $t_stats->{NetSumStats}->{$x};
     }
  }

  if ($param{DiskStats}) {
     ($stats->{DiskStats},$stats->{DiskSumStats}) = DiskStats();

     foreach my $x (keys %{$stats->{DiskStats}}) {
        foreach my $y (keys %{$stats->{DiskStats}->{$x}}) {
           $stats->{DiskStats}->{$x}->{$y} -= $t_stats->{DiskStats}->{$x}->{$y};
        }
     }

     foreach my $x (keys %{$stats->{DiskSumStats}}) {
        $stats->{DiskSumStats}->{$x} -= $t_stats->{DiskSumStats}->{$x};
     }
  }

  return $stats;
}
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
steffenw
 2005-12-20 20:48
#60997 #60997
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
     my @tm = localtime(time);

    $tm[4] += 1;
    $tm[5] += 1900;

    foreach (@tm) {
       $_ = "0$_" if $_ < 10;
    }

    $stats->{TimePoint}->{Date} = "$tm[5]-$tm[4]-$tm[3]";
    $stats->{TimePoint}->{Time} = "$tm[2]:$tm[1]:$tm[0]";

oder
Code: (dl )
1
2
3
4
5
     my @tm = (localtime)[reverse 0..5]; # time ist default, gleich richtig für spätere Array-Slices sortieren
    $tm[0] += 1900;
    $tm[1]++;
    $stats->{TimePoint}->{Time} = sprintf '%02d:%02d:%02d', @tm[0..2];
    $stats->{TimePoint}->{Date} = sprintf '%04d-%02d-%02d', @tm[3..5];


copy and past
Code: (dl )
1
2
3
4
5
6
 $stats->{SysInfo}     = SysInfo()   if $param{SysInfo};
 $stats->{MemStats}    = MemStats()  if $param{MemStats};
 $stats->{SockStats}   = SockStats() if $param{SockStats};
 $stats->{DiskUsage}   = DiskUsage() if $param{DiskUsage};
 $stats->{LoadAVG}     = LoadAVG()   if $param{LoadAVG};
 $stats->{Processes}   = Processes() if $param{Processes};

oder
Code: (dl )
1
2
3
4
for (qw/SysInfo MemStats SockStats DiskUsage LoadAVG Processes/) {
 no strict 'refs';
 $stats->{$_}  = &$_() if $param{$_};
}

und so weiter.

copy and past ist nicht Perl. Das machen alle die anderen, weil sie von der Programmiersprache allein gelassen werden.

Versuch's noch mal dahin zu optimieren, man wird nicht dümmer davon.\n\n

<!--EDIT|steffenw|1135104812-->
$SIG{USER} = sub {love 'Perl' or die};
bloonix
 2005-12-20 21:25
#60998 #60998
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
     my @tm = (localtime)[reverse 0..5]; # time ist default, gleich richtig für spätere Array-Slices sortieren
    $tm[0] += 1900;
    $tm[1]++;
    $stats->{TimePoint}->{Time} = sprintf '%02d:%02d:%02d', @tm[0..2];
    $stats->{TimePoint}->{Date} = sprintf '%04d-%02d-%02d', @tm[3..5];


okay, es gibt einiges zu optimieren.

Code: (dl )
1
2
3
4
for (qw/SysInfo MemStats SockStats DiskUsage LoadAVG Processes/) {
 no strict 'refs';
 $stats->{$_}  = &$_() if $param{$_};
}


So ähnlich hatte ich es vorher und den Tipp hatte mir esskar schon
gegeben. Ich habe mich gegen die Schleife entschieden.

[quote=steffenw,20.12.2005, 19:48]
copy and past ist nicht Perl. Das machen alle die anderen, weil sie von der Programmiersprache allein gelassen werden.
[/quote]

Hä?

Das sehe ich nicht so. Perl lebt davon! Oder schreibst du deine Funktionen
so, dass man sie in keinem weiteren Skript nutzen kann? Ausserdem ist
Copy und Paste bei sich wiederholenden Vorgängen normal und nicht in
jedem Fall ist eine Schleife von Nutzem.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 3 4 5 6 7 ... 12 >| >> 119 Einträge, 12 Seiten



View all threads created 2005-12-19 02:24.