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

string nach jeder 4000 Stelle ein TAB einsetzten (Seite 2)



<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
bloonix
 2007-08-02 17:05
#97328 #97328
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Also wenn du genau weißt, dass der String nie größer als xy ist,
dann würde ich dein Beispiel einsetzen. Ich finde deinen Code
aboslut ok! Wenn du nicht weiß, wie lang der String sein könnte,
dann würde ich die schnellere Variante nehmen. Schau doch mal
nach... vielleicht kannst du auch was mit split() zaubern, aber ich
denke mal, das unpack() ungeschlagen bleibt.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2007-08-02 17:11
#97329 #97329
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
traue nie einem benchmark, den du nicht selbst gefälscht hast.
Code: (dl )
$tmp_line =~ s/(.{4000})/$1\t/g;

verändert den string.
in benchmarks immer werte zurücksetzen oder vorher kopieren!

verändertes ergebnis:
Code: (dl )
1
2
3
4
             Rate   _regex _unpack2 _unpack1
_regex 18553/s -- -40% -90%
_unpack2 31164/s 68% -- -83%
_unpack1 180706/s 874% 480% --
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2007-08-02 17:11
#97330 #97330
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Moooooment... die Benchmarks sind nicht gleichberechtigt, da der
String durch die Regex verändert wird - danke @pq für den Tipp!
Hier nochmal ein gleichberechtigter Vergleich:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use strict;
use warnings;
use Benchmark;

my $line = 'x' x 18_000;

open my $frontend, '>>', '/dev/null' or die $!; 

Benchmark::cmpthese(-1, {
   _regex   => \&_regex,
   _unpack1 => \&_unpack1,
   _unpack2 => \&_unpack2
});

sub _regex {
    my $tmp_line = $line;
    if( length $tmp_line < 4000 ){
        $tmp_line .= "\t" x 5;
    }   
    else{
        $tmp_line =~ s/(.{4000})/$1\t/g;
    }   
    print $frontend $tmp_line;
}

sub _unpack1 {
    my $tmp_line = $line;
    my $laenge = length($tmp_line); 
    if($laenge <=4000) {
        print $frontend "$tmp_line\t\t\t\t\n";
    }   
    elsif($laenge <= 8000) {
        my ($a, $b) = unpack("A4000 A4000", $tmp_line);
        print $frontend "$a\t$b\t\t\t\n";
    }   
    elsif($laenge <= 12000) {
        my ($a, $b, $c) = unpack("A4000 A4000 A4000", $tmp_line);
        print $frontend "$a\t$b\t$c\t\t\n";
    }   
    elsif($laenge <= 16000) {
        my ($a, $b, $c, $d) = unpack("A4000 A4000 A4000 A4000", $tmp_line);
        print $frontend "$a\t$b\t$c\t$d\t\n";
    }   
}

sub _unpack2 {
    my $tmp_line = $line;
    my $len = length($tmp_line);
    my $pos = 0;
    my $tab = 5;
    while ( my $s = unpack("x$pos A4000", $tmp_line) ) { 
        $tab--;
        print $frontend "$s\t";
        $pos += 4000;
        last if $pos >= $len;
    }
    print $frontend "\t" x $tab;
    print $frontend "\n";
}


Code: (dl )
1
2
3
4
             Rate   _regex _unpack2 _unpack1
_regex 19814/s -- -39% -93%
_unpack2 32582/s 64% -- -88%
_unpack1 265564/s 1240% 715% --
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
mr-sansibar
 2007-08-02 17:26
#97331 #97331
User since
2006-04-13
90 Artikel
BenutzerIn
[default_avatar]
das hätte ich aber nicht gedacht :-)))
aber dafür ist eurer Skript wesentlich kleiner und kompakter !
renee
 2007-08-02 18:56
#97335 #97335
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schnelligkeit ist auch nicht immer das Maß der Dinge. Kommt immer darauf an, was man macht. Ich habe es lieber kompakt (aber noch lesbar) als dass ich mir 3 Millisekunden spare...

Muss man natürlich von Fall zu Fall entscheiden.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-08-02 17:31
#97336 #97336
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Regexes sind oft kompakter, aber keinesfalls schneller.
Es geht auch weniger darum, wie elegant dein Skript
nun ausschauen soll. Es muss lesbar sein. Alles andere
muss schnell und speicherschonent und eventuell
wiederverwendbar sein.

Edit: und sicher muss es sein - was wiederrum die Schnelligkeit beeinflusst
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
mr-sansibar
 2007-08-02 17:33
#97337 #97337
User since
2006-04-13
90 Artikel
BenutzerIn
[default_avatar]
danke gut zu wissen !!!
mr-sansibar
 2007-08-02 19:39
#97343 #97343
User since
2006-04-13
90 Artikel
BenutzerIn
[default_avatar]
was ich ergänzend dazu sagen wollte.
bei den obigen Lösungen wo sie mit unpack1 und unpack2 gelöst worden sind, muss man vorab wissen wie lang ein string sein kann höchsten. aber bei der lösung mit regex ist es schnurz egal. es legt nach jeder 4000 stelle ein tab zwischen die stringzeichen, ob es 1000 zeichen oder 100.000 zeichen. denn ich hatte auch string längen von 100.000.

aus diesem grund werde ich mich für die regex variante entscheiden, obwohl sie langsam ist ;-)
aber auf die paar Sekunden kommst nicht mehr an.

ansonste vielen dank für die nützlichen tips
Gast Gast
 2007-08-03 14:13
#97399 #97399
mr-sansibar+2007-08-02 17:39:47--
was ich ergänzend dazu sagen wollte.
bei den obigen Lösungen wo sie mit unpack1 und unpack2 gelöst worden sind, muss man vorab wissen wie lang ein string sein kann höchsten.

Es soll mir ja egal sein, welche Lösung du nun verwendest, denn das ist
ja hier kein Wettrennen, aber ich bin schon ein wenig enttäuscht, denn
du hast meine Lösung nicht verstanden geschweige es sauber getestet!

Code: (dl )
1
2
3
4
5
6
7
8
9
10
my $line = 'x' x 22; 
my $len = length($line);
my $size = 4;
my $pos = 0;

while ( my $s = unpack("x$pos A$size", $line) ) {
print "<$s\t>\n";
$pos += $size;
last if $pos >= $len;
}


Code: (dl )
1
2
3
4
5
6
<xxxx   >
<xxxx >
<xxxx >
<xxxx >
<xxxx >
<xx >


viele grüße opi
bloonix
 2007-08-03 14:42
#97400 #97400
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
renee+2007-08-02 16:56:05--
Schnelligkeit ist auch nicht immer das Maß der Dinge. Kommt immer darauf an, was man macht. Ich habe es lieber kompakt (aber noch lesbar) als dass ich mir 3 Millisekunden spare...

3 Millisekunden? Bei 100_000 Zeilen und 18_000 Zeichen pro Zeile
sind es schon 2 Sekunden. ^^
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



View all threads created 2007-08-02 13:42.