Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7376[/thread]

Performance: Referenzen vs. Typeglobs



<< >> 7 Einträge, 1 Seite
Benedikt
 2005-10-20 16:30
#59054 #59054
User since
2005-10-16
4 Artikel
BenutzerIn
[default_avatar]
Hallo Community,

an vielen Stellen und in Lehrbüchern werden Typeglobs wegen ihres Performancevorteils gelobt. Ich wollte das mal genau wissen und hab folgendes Skript aufgesetzt:

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
#!Perl -w

use Benchmark;
$repetitions = 1000000;
@testArray = (22, 34, 433, 123, 435, 66);

sub typeglobs {
   local *kopie = shift;
   foreach (@kopie) {
       $_ *= 2;
   }
}

sub references {
   my $rarray = shift;
   foreach (@$rarray) {
       $_ *= 2;
   }
}

print "Ueber Referenzen:\n";
timethis($repetitions, "references(\@testArray)");

print "\n\nUeber Typeglobs:\n";
timethis($repetitions, "typeglobs(*testArray)");


Beide Funktionen (typeglobs und references) machen hier das selbe, nämlich die Multiplikation jedes Arrayeintrages mit 2.

Ich war sehr überrascht, dass meine typeglobs-Funktion fast drei mal so lang braucht, wie die references-Funktion.

Vielleicht habt ihr ja andere Ergebnisse? Oder ist mein Code schlicht und einfach falsch?

Viele Grüße
Benedikt
pq
 2005-10-20 16:52
#59055 #59055
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
du solltest noch mit einbeziehen, dass @testArray immer verändert wird und irgendwann
nur noch werte von 'inf' enthält.
also besser immer wieder zurücksetzen.
vertausch mal die reihenfolge, dann solltest du einen unterschied bemerken.
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
Benedikt
 2005-10-20 16:56
#59056 #59056
User since
2005-10-16
4 Artikel
BenutzerIn
[default_avatar]
Das hab ich mir auch schon gedacht. Hab die Reihenfolge schon mal vertauscht aber hat auch keinen Unterschied ergeben. Wenn man das Array zwischen den beiden timethis-Aufrufen ausgibt, hat es auch noch den alten Zustand.
Strat
 2005-10-20 17:09
#59057 #59057
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Benedikt,20.10.2005, 14:30]an vielen Stellen und in Lehrbüchern werden Typeglobs wegen ihres Performancevorteils gelobt.[/quote]
Kann es sein, dass du sehr alte Perl-Buecher verwendest? Referenzen sind einfacher zu handeln, arbeiten auch vernuenftig mit my-variablen zusammen, und sollten deshalb bevorzugt werden.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Benedikt
 2005-10-20 17:51
#59058 #59058
User since
2005-10-16
4 Artikel
BenutzerIn
[default_avatar]
Es gibt ja relativ wenige Perl-Bücher, die sich mit Typeglobs beschäftigen. Meine hauptsächliche Quelle ist "Fortgeschrittene Perl Programmierung" aus dem O'Reilly Verlag.
pq
 2005-10-20 18:01
#59059 #59059
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Benedikt,20.10.2005, 14:56]Das hab ich mir auch schon gedacht. Hab die Reihenfolge schon mal vertauscht aber hat auch keinen Unterschied ergeben. Wenn man das Array zwischen den beiden timethis-Aufrufen ausgibt, hat es auch noch den alten Zustand.[/quote]
dann printe mal nach dem zweiten aufruf und erlebe eine überraschung...
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
pq
 2005-10-20 18:05
#59060 #59060
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Benedikt,20.10.2005, 14:30]
Code: (dl )
1
2
3
4
5
6
sub references {
   my $rarray = shift;
...
}
print "Ueber Referenzen:\n";
timethis($repetitions, "references(\@testArray)");
[/quote]
du machst da einen groben fehler.
Wiki:use strict

edit: fazit - glaube nur den benchmarks, die du selbst gefälscht hast...\n\n

<!--EDIT|pq|1129817227-->
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
<< >> 7 Einträge, 1 Seite



View all threads created 2005-10-20 16:30.