Hallo,
hier mal das Skript etwas umgebaut mit (einfacher) Benutzung des Benchmark Moduls:
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
use strict;
use warnings;
use Benchmark;
open FH, "test.html" or die "test.html: $!";
my $string = do { local $/; <FH> };
close FH;
timethese (1_000_000, {
func1 => \&func1,
func2 => \&func2,
});
sub func1 {
my $start = index($string, "<title>");
my $ende = index($string, "</title>");
my $title = substr($string, $start+7, $ende - $start - 7);
}
sub func2 {
my $title = Å© if ( $string =~ m{<title>(.*)</title>}i ) ;
}
Ergebnis:
QuoteBenchmark: timing 1000000 iterations of func1, func2...
func1: 1 wallclock secs ( 1.76 usr + 0.00 sys = 1.76 CPU) @ 568181.82/s (n=1000000)
func2: 15 wallclock secs (14.47 usr + 0.00 sys = 14.47 CPU) @ 69108.50/s (n=1000000)
Wie zu erkennen ist, ist die erste Variante die schnellere...
Zum print:
Die print-Ausgabe verlangsamt das Ganze, weil nun die Ausgabe über die Console bewerkstelligt werden muss, und das ist ein lahmer Prozess, der seine Zeit beansprucht...
Wenn es performant sein soll, also die Ausgabe ganz vermeiden, oder die Sachen sammeln und danach ausgeben; dann braucht man aber Arbeitsspeicher, um das zu sammeln.
Das Ergebnis, wenn ich mir den Title auf STDERR ausgeben lasse und STDOUT in eine Datei umleite:
QuoteBenchmark: timing 1000000 iterations of func1, func2...
func1: 28 wallclock secs ( 3.44 usr + 2.70 sys = 6.14 CPU) @ 162866.45/s (n=1000000)
func2: 45 wallclock secs (18.82 usr + 3.27 sys = 22.09 CPU) @ 45269.35/s (n=1000000)
Das zeigt zwar, dass die index/substr Methode schneller als Regex arbeitet, aber die Ausgabe bremst enorm...
Der zweite Test wurde mit folgendem Code durchgeführt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use strict;
use warnings;
use Benchmark;
open FH, "test.html" or die "test.html: $!";
my $string = do { local $/; <FH> };
close FH;
timethese (1_000_000, {
func1 => \&func1,
func2 => \&func2,
});
sub func1 {
my $start = index($string, "<title>");
my $ende = index($string, "</title>");
print STDERR substr($string, $start+7, $ende - $start - 7);
}
sub func2 {
print STDERR Å© if ( $string =~ m{<title>(.*)</title>} ) ;
}
und mit folgendem Aufruf gestartet:
Quoteperl perl03 1>result.txt
[edit] $string-Deklaration modifiziert (von use vars qw// auf my...); kleine Textkorrekturen[/edit]\n\n
<!--EDIT|Linuxer|1148207312-->
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!