Hallo Andreas!
@temp = @array;
@array = @temp[0..$i-1];
push(@array, $Wert,@temp[$i..$#temp]);
Ich will Dich ja nicht aergern... aber bei dieser Methode ist offensichtlich, dass Unmengen von Daten im Speicher hin- und herkopiert werden. Es ist immer besser, eine builtin-Funktion zu nutzen, wenn eine vorhanden ist. (Schon klar, Du hast nicht gewusst, dass es splice gibt.) Ich hab einfach mal schnell einen kleinen Performancetest geschrieben - der Quelltext steht unten - und hier ist das Ergebnis:
Testing the splice method... The splice method took 1 seconds.
Testing the push method... The push method took 500 seconds.
Alles klar? ;-)
Testmaschine war ein 133 MHz Cyrix Prozessor (Cyrix P166+) mit ausreichend L1- und L2-Cache. OS ist WinNT4 SP3.
Im Anschluss noch der Source-Code.
Calocybe
======================================
#!/path/to/perl
$NUMBER_OF_INITIAL_ELEMENTS = 20000;
$NUMBER_OF_INSERTED_ELEMENTS = 1000;
$INSERT_POSITION = 10000;
@array = ();
sub reset_array {
my $i;
@array = ();
for ($i=0; $i<$NUMBER_OF_INITIAL_ELEMENTS; $i++) {
push @array, "array element ".$i;
}
}
sub insert_via_splice {
my $position = shift;
my $new_element = shift;
splice @array, $position, 0, $new_element;
}
sub insert_via_push {
my @temp;
my $position = shift;
my $new_element = shift;
@temp = @array;
@array = @temp[0..$position-1];
push(@array, $new_element, @temp[$position..$#temp]);
}
sub main {
my ($starttime, $splice_duration, $push_duration);
my $i;
#
# test the splice method
#
print "Testing the splice method... ";
reset_array();
$starttime = time();
for ($i=0; $i<$NUMBER_OF_INSERTED_ELEMENTS; $i++) {
insert_via_splice($INSERT_POSITION, "subsequently inserted element ".$i);
}
$splice_duration = time() - $starttime;
print "The splice method took $splice_duration seconds.\n";
#
# test the push method
#
print "Testing the push method... ";
reset_array();
$starttime = time();
for ($i=0; $i<$NUMBER_OF_INSERTED_ELEMENTS; $i++) {
insert_via_push($INSERT_POSITION, "subsequently inserted element ".$i);
}
$push_duration = time() - $starttime;
print "The push method took $push_duration seconds.\n";
}
main();
======================================