Thread ist das hier sinnvoll?: benchmarking-vergleich (3 answers)
Opened by Gast at 2006-05-21 11:37

Linuxer
 2006-05-21 14:05
#66385 #66385
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Hallo,

hier mal das Skript etwas umgebaut mit (einfacher) Benutzung des Benchmark Moduls:
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
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;

# test.html beinhaltet diese Beitragsseite lokal gespeichert
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:
Quote
Benchmark: 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:
Quote
Benchmark: 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:
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
#!/usr/bin/perl
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:
Quote
perl 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!

View full thread ist das hier sinnvoll?: benchmarking-vergleich