Thread String, character, suche und ersetzen (26 answers)
Opened by Graf Herschel at 2018-12-11 10:42

Linuxer
 2018-12-14 23:04
#189400 #189400
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
So, ich habe noch mal ein paar Routinen hinzugefügt und manche nochmal variiert. Hier noch das Benchmark-Ergebnis als Abschluss.
Zuerst wird jede Routine einmal mit einem kurzen String testweise aufgerufen, um die Funktion der Routine zu erkennen.
Danach wird ein neuer Teststring aus random Characters generiert und damit getestet.

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
Smartmatch is experimental at backwards_replace.pl line 58.
Original String: abcdefABCDEF
unpack_C_pack: abcdefABKDEF
regex_match_start: abcdefABKDEF
rindex_substr: abcdefABKDEF
regex_match_end: abcdefABKDEF
unpack_U_pack: abcdefABKDEF
reverse_regex: abcdefABKDEF
rindex_substr_max: abcdefABKDEF
regex_with_K: abcdefABKDEF
for_smartmatch: abcdefABKDEF

Using new string for Benchmark.
String Length: 5000
Rate regex_match_end unpack_U_pack unpack_C_pack reverse_regex regex_match_start for_smartmatch regex_with_K rindex_substr rindex_substr_max
regex_match_end 373/s -- -91% -93% -100% -100% -100% -100% -100% -100%
unpack_U_pack 4267/s 1045% -- -17% -98% -98% -98% -98% -99% -99%
unpack_C_pack 5168/s 1287% 21% -- -97% -97% -97% -98% -99% -99%
reverse_regex 170836/s 45745% 3904% 3205% -- -10% -11% -24% -52% -80%
regex_match_start 189150/s 50659% 4333% 3560% 11% -- -1% -16% -47% -77%
for_smartmatch 190934/s 51138% 4375% 3594% 12% 1% -- -15% -46% -77%
regex_with_K 224878/s 60247% 5171% 4251% 32% 19% 18% -- -37% -73%
rindex_substr 355071/s 95185% 8222% 6770% 108% 88% 86% 58% -- -57%
rindex_substr_max 835106/s 224004% 19473% 16058% 389% 342% 337% 271% 135% --


Schema:
Alle Routinen nehmen den zu verarbeitenden String entgegen und geben den überarbeiteten String wieder zurück.

Gewinner ist:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub rindex_substr_max {
    my ( $string, ) = @_;

    my $max = 0;
    for my $x ( qw( B C f ) ) {
        my $i = rindex $string, $x;
        $max  = $i   if $i > $max;
    }

    substr( $string, $max, 1 ) = "K";

    return $string;
}


Was mich überrascht, dass diese rindex_substr_max() soviel schneller als meine erste rindex_substr() ist:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub rindex_substr {
    my ( $string, ) = @_;

    my %pos;
    for my $x ( qw( B C f ) ) {
        $pos{$x} = rindex($string,$x);
    }
    my $replace = ( sort { $pos{$b} <=> $pos{$a} } keys %pos )[0];

    substr( $string, $pos{$replace}, 1 ) = "K";

    return $string;
}


Ich hätte nicht gedacht, dass dieser Hash %pos und die Sortierung seiner drei Elemente soviel Zeit frisst...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread String, character, suche und ersetzen