Calocybe: Eintrag in Array einfügen

Beitrag lesen

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();

======================================