Performanceunterschied oder nur Schreibersparnis?
Nickel
- perl
Hi,
sind folgende Statements gleichwertig?
1.
$a = "";
$b = "";
....
$z = "";
und
2.
$a = $b = ....... = $z = "";
Hi Nickel!
sind folgende Statements gleichwertig?
Das zweite ist schneller. Aber wofür brauchst du sowas? Wären Arrays nicht vorteilhafter?
MfG H☼psel
Hi Nickel!
sind folgende Statements gleichwertig?
Das zweite ist schneller. Aber wofür brauchst du sowas? Wären Arrays nicht vorteilhafter?
Auf meinem System ist Variante 1 schneller als variante 2. Beide aber sind langsamer als Variante 3.
#!C:/Programme/Perl/bin/perl.exe -w
#
use strict;
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>error.txt") or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
use Benchmark;
print "benchmark\n";
my($v,$w,$x,$y,$z);
timethese( 5000000, { one => 'mysub1', two => 'mysub2', three => 'mysub3', } );
print "\n";
sleep(20);
sub mysub1{
$v=""; $w=""; $x=""; $y=""; $z="";
}
sub mysub2{
$v = $w = $x = $y = $z = "";
}
sub mysub3{
( $v, $w, $x, $y, $z ) = ("", "", "", "", "" );
}
exit 0;
mfg Beat;
Hi Beat!
Asche über mein Haupt. Ich bin von PHP ausgegangen.
MfG H☼psel
Hi,
sind folgende Statements gleichwertig?
$a = "";
$b = "";
....
$z = "";und
2.
$a = $b = ....... = $z = "";
oder 3.
my ($c,$d,$e,$f) = ("","","","");
PS: $a und $b sind reservierte vorderfinierte Variablen. Verwende sie nur für sort()
Deine Versionen sind gleichwertig.
Ich bevorzuge zudem die erste Variante wegen der Klarheit, vor allem bei globalen Initialisierungen.
mfg Beat
var alphabet = new Array();
... array wird mit allen Buchstaben initialisiert ...
// Zurücksetzen
alphabet = new Array();
// oder
for(key in alphabet) {
alphabet[key] = "";
}
Das ist glaube ich ratsamer als deine Variante(n).
Gruss
EDIT: Sorry, habe irrtürmlich in JavaScript den Beipsiel gezeigt.
In Perl ist es halt so ähnlich, von der Logik her gleich.
sind folgende Statements gleichwertig?
Was willst du konkret Wissen?
Selbst wenn eine dieser Schreibweisen eine Zweitersparnis bedeuten würde, so läge diese auf einem Handelüblichen Rechner, der nach 1990 gebaut wurde, nur bei wenigen Milli- (vermutlich sogar eher Mikro-)sekunden. Machst du dir wirklich Gedanken ob du hier in dem Fall 1 Mikrosekunde einsparst?
Ich vermute du bist ein extrem sparsamer Autofahrer.
Struppi.
sind folgende Statements gleichwertig?
Was willst du konkret Wissen?
Selbst wenn eine dieser Schreibweisen eine Zweitersparnis bedeuten würde, so läge diese auf einem Handelüblichen Rechner, der nach 1990 gebaut wurde, nur bei wenigen Milli- (vermutlich sogar eher Mikro-)sekunden. Machst du dir wirklich Gedanken ob du hier in dem Fall 1 Mikrosekunde einsparst?
Ich vermute du bist ein extrem sparsamer Autofahrer.
Wenn eine Routine 1000mal aufgerufen wird, ist das legitim.
mfg Beat
Yerf!
Wenn eine Routine 1000mal aufgerufen wird, ist das legitim.
Dann sollte man eher überlegen, ob man überhaupt soviele Variablen initialisieren muss...
Gruß,
Harlequin
Wenn eine Routine 1000mal aufgerufen wird, ist das legitim.
Dann sollte man eher überlegen, ob man überhaupt soviele Variablen initialisieren muss...
Du hast bei
my ($u,$v) = ("","");
bereits einen bemerkbaren Vorteil gegenüber den anderen zwei Varianten
Der Vorteil wächst mit jeder zusätzlichen Variable. Es ist eher eine konzeptionelle Stilfrage, welche sich potentiell ausbezahlt.
Allerdings würde ich dies nur in Subfunktionen einsetzen, nie in globalen Initialisierungsschritten.
mfg Beat
Du hast bei
my ($u,$v) = ("","");
bereits einen bemerkbaren Vorteil gegenüber den anderen zwei Varianten
Das bezweifle ich, du hast in deinem Test ja das my ausgelagert, in sofern ist der Benchmark nicht so aussagekräftig. Wenn du die my Deklaration in die Sub packst, sind die Unterschiede gering
Allerdings würde ich dies nur in Subfunktionen einsetzen, nie in globalen Initialisierungsschritten.
Wo sie eben noch weniger eine Auswirkung hat. Mikrosekunden sparen zu wollen ist absoluter overkill, vor allem wenn es auf Kosten der Lesbarkeit geht.
Struppi.
Wenn eine Routine 1000mal aufgerufen wird, ist das legitim.
Findest du? Wenn du deinen Benchmark mal mit lexikalischen Variabeln machst, schrumpft der Unterschied und selbst wenn du eine Funktion 10.000 mal aufrufst, wird die Ersparnis durch eine bestimmte Schreibweise hier an der Stelle so gering sein, das sie innerhalb eine Meßfehlers liegt.
Struppi.