Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8002[/thread]

ist das hier sinnvoll?: benchmarking-vergleich



<< >> 4 Einträge, 1 Seite
Gast Gast
 2006-05-21 11:37
#66383 #66383
Code: (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
43
44
45
46
47
48
49
50
51
52
53
54
55
#!perl -w

my $str = '';

open( FH, "<test.htm") or die("Cannot open file");
while(<FH>)
{
$str .= $_;
}
close(FH);

$length = length($str);

print "Str-Laenge: $length\n";

# start timer
$start = time();

# perform a math operation 200000 times
for ($x=0; $x<=1000000; $x++)
{
### Operations
&test2;
}

# end timer
$end = time();

# report
print "Time taken was ", ($end - $start), " seconds";





sub test1()
{
my $start = index($str, "<title>");
my $ende = index($str, "</title>");


$ende = $ende - $start - 7;
$start += 7;

my $title = substr($str, $start, $ende);
}

sub test2()
{
if($str =~ /<title>(.*)<\/title>/i )
{
my $title = $1;

}
}



bei dem ersten versuch habe ich, wie hier test2() ausgeführt, Laufzeit 14 Sekunden.

test1() Laufzeit: 3 sekunden!

Sobald ich aber in beide Funktionen ein print eingesetzt habe, waren die plötzlich gleichschnell! Könnte ihr das mal testen?

habt ihr noch ideen, wie ich die funktionen tunen könnte?

greetz, timebeater
lichtkind
 2006-05-21 12:20
#66384 #66384
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
bei sowas immer modul benchmark nehmen, und dann erstmal genau feststellen wo zeit hingeht.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
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!
Dubu
 2006-05-21 17:42
#66386 #66386
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Man sollte aber nicht verschweigen, dass die beiden Varianten unterschiedliche Ergebnisse bringen können: Der Regex-Aufruf hier ignoriert Groß- und Kleinschreibung und sucht bis zum letzten Vorkommen von "</title>" (wegen des gierigen "*"); die index-Variante erwartet identische Groß-/Kleinschreibung und nimmt das erste Vorkommen von "</title>".
Man kann die Regex so ändern, dass sie der index-Variante entspricht (z.B. ".*?" statt ".*" und den i-Modifier weglassen), umgekehrt geht das nicht.
<< >> 4 Einträge, 1 Seite



View all threads created 2006-05-21 11:37.