[quote=jan,22.05.2004, 22:42]
aber der regexp ist offensichtlich schneller...
[/quote]
Aber nur, so lange deine Regex auf nur
eine einzelne Ziffer prueft. Das Ergebnis kehrt sich um, wenn wirklich auf Zahlen (d.h. mehrere Ziffern hintereinander) getestet wird.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
~/perl/test> cat nurzahlen.pl
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw/cmpthese/;
cmpthese(-5, {
regexpZiffer => sub { my $var = '1555000000'; my $onlydigits = 1 if($var =~ m/^\d$/);},
regexpStern => sub { my $var = '1555000000'; my $onlydigits = 1 if($var =~ m/^\d*$/);},
regexpPlus => sub { my $var = '1555000000'; my $onlydigits = 1 if($var =~ m/^\d+$/);},
regexpInv => sub { my $var = '1555000000'; my $onlydigits = 1 unless ($var =~ m/\D/);},
inttest => sub { my $var = '1555000000'; my $onlydigits = 1 if(int($var) eq $var);},
});
~/perl/test> ./nurzahlen.pl
Rate regexpStern regexpPlus inttest regexpInv regexpZiffer
regexpStern 1049899/s -- -2% -4% -28% -37%
regexpPlus 1069469/s 2% -- -2% -27% -36%
inttest 1096502/s 4% 3% -- -25% -35%
regexpInv 1459240/s 39% 36% 33% -- -13%
regexpZiffer 1678905/s 60% 57% 53% 15% --
Der schnellste Test (nach dem auf einzelne Ziffern) ist also der auf eine Nicht-Ziffer, gefolgt vom Vergleich mit int().
Letzterer hat aber einen anderen Nachteil: Er funktioniert nicht, wenn die Ziffernfolge mit einer Null anfaengt.