Thread Performanteste ord()-Lösung gesucht (31 answers)
Opened by bianca at 2019-07-08 08:05

haj
 2019-07-08 10:56
#190176 #190176
User since
2015-01-07
527 Artikel
BenutzerIn

user image
Ein Ex-Kollege sagte mal: "Kannst Du's nicht messen, dann kannst Du's vergessen."

Messen können wir.

Das Resultat:
Code: (dl )
1
2
3
4
Benchmark: timing 10000 iterations of daxim, gwen , muffi,...
daxim: 14.6732 wallclock secs (14.41 usr + 0.18 sys = 14.59 CPU) @ 685.40/s (n=10000)
gwen : 0.830139 wallclock secs ( 0.82 usr + 0.00 sys = 0.82 CPU) @ 12195.12/s (n=10000)
muffi: 0.690399 wallclock secs ( 0.68 usr + 0.00 sys = 0.68 CPU) @ 14705.88/s (n=10000)

Das sind schon merkliche Unterschiede zwischen den Alternativen!

Der komplette Code:
Code (perl): (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
26
27
28
29
30
31
32
33
34
use 5.020;
use List::AllUtils qw(first);
use Encode;
use utf8;
use Benchmark ':hireswallclock';

sub daxim {
    my $string_of_characters = shift;
    first { $_ gt "\xff" } split //, $string_of_characters;
}

sub muffi {
    my $str = shift;
    $str !~ /^[\x{00}-\x{ff}]*$/;
}

sub GwenDragon {
    my $string = shift;
    scalar grep /[^\0-\x{ff}]/, $string;
}

my $string = 'a' x 10000 . '€';

say "daxim:      ", encode('UTF-8',daxim($string));
say "muffi:      ", muffi($string);
say "GwenDragon: ", GwenDragon($string);


timethese(10000,
          {'daxim' => sub { daxim($string) },
           'muffi' => sub { muffi($string) },
           'gwen ' => sub { GwenDragon($string) },
          },
         );


Eine kleine Korrektur habe ich vorgenommen: Bei GwenDragon's Methode muss \0 anstelle von 0 rein, sonst verpasst Du die versammelten Satzzeichen.

Der Unterschied wird - in der gleichen Reihenfolge - noch deutlicher, wenn der String entweder kein Zeichen >255 enthält, oder wenn das Zeichen >255 an früherer Stelle auftritt.

View full thread Performanteste ord()-Lösung gesucht