Thread Leerzeichen-Regex lässt StackExchange ausfallen? (27 answers)
Opened by GwenDragon at 2016-07-21 13:24

Linuxer
 2016-07-26 17:05
#185150 #185150
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Habe ich da einen Denkfehler?

Ich habe Dein Skript einmal ausgeführt, um ein Gefühl für die Laufzeit zu bekommen. Und es lief in akzeptabler Zeit durch.

Code: (dl )
1
2
3
4
5
6
7
8
timethis 100000: 5.43372 wallclock secs ( 5.43 usr +  0.00 sys =  5.43 CPU) @ 18419.60/s (n=100000)
timethis 100000: 1.66317 wallclock secs ( 1.67 usr + 0.00 sys = 1.67 CPU) @ 59916.12/s (n=100000)
timethis 100000: 5.62105 wallclock secs ( 5.59 usr + 0.00 sys = 5.59 CPU) @ 17905.10/s (n=100000)
timethis 100000: 1.7069 wallclock secs ( 1.70 usr + 0.00 sys = 1.70 CPU) @ 58788.95/s (n=100000)
M1A: 100000
M1B: 0
M2A: 100000
M2B: 0


Dann habe ich das Skript etwas abgeändert, um mit echtem "$" zu arbeiten. D.h. den String in $inputB lass ich wirklich mit Spaces enden (ohne das B am Ende).
Und die s/// habe ich geändert, dass wirklich nach Spaces am Ende ($) gesucht werden soll und diese dann durch Leerstring ersetzt werden...

Die Laufzeit wurde lang, sehr lang für den C2A ... Keine Ahnung, ob ich warten mag, bis er fertig wird.

more (8.9kb):

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
35
36
37
38
39
40
41
42
use strict;
use warnings;

use Benchmark qw(:all :hireswallclock) ;

our $inputA = "X".(" \t" x 10000)."A";
our $inputB = "X".(" \t" x 10000);                       # spaces at the end

our $m1A = 0;
our $m1B = 0;
our $m2A = 0;
our $m2B = 0;

my $c1A = <<'CODE';
my $s = $inputA;
$m1A++ if ($s =~ s/[\s\u200c]+$//g);
CODE

my $c1B = <<'CODE';
my $s = $inputB;
$m1B++ if ($s =~ s/[\s\u200c]+$//g);
CODE

my $c2A = <<'CODE';
my $s = $inputA;
$m2A++ if ($s =~ s/(?<=\S)[\s\u200c]+$//g);
CODE

my $c2B = <<'CODE';
my $s = $inputB;
$m2B++ if ($s =~ s/(?<=\S)[\s\u200c]+$//g);
CODE

timethis(100_000,$c1A);
timethis(100_000,$c1B);
timethis(100_000,$c2A);
timethis(100_000,$c2B);

print "M1A: $m1A\n";
print "M1B: $m1B\n";
print "M2A: $m2A\n";
print "M2B: $m2B\n";



Ich habe ausreichend gewartet und hier das Ergebnis:

Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
timethis 100000: 12.2518 wallclock secs (12.18 usr +  0.00 sys = 12.18 CPU) @ 8208.16/s (n=100000)
timethis 100000: 5.47224 wallclock secs ( 5.48 usr + 0.00 sys = 5.48 CPU) @ 18261.50/s (n=100000)
timethis 100000: 195.541 wallclock secs (194.83 usr + 0.00 sys = 194.83 CPU) @513.27/s (n=100000)
timethis 100000: 5.57992 wallclock secs ( 5.55 usr + 0.00 sys = 5.55 CPU) @ 18005.04/s (n=100000)
M1A: 0
M1B: 100000
M2A: 0
M2B: 100000



Getestet auf einem WinDOS 7 mit einem Perl 5.18.0
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 Leerzeichen-Regex lässt StackExchange ausfallen?