1 2 3 4 5 6 7 8 9 10
open TRACEFILE, "<C:\\myfile.txt" or die "cannot open tracefile"; my $found=0; while (!eof TRACEFILE) { $in_line = <TRACEFILE>; # lese aktuelle Zeile ein chomp($in_line); if ($in_line =~ m/CP_NG/) { $found++; } } print "anzahl treffer: $found\n";
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
import java.io.BufferedReader;
import java.io.FileReader;
public class Test {
public static void main(String[] args) {
int found=0;
try {
BufferedReader reader = new BufferedReader(new FileReader("c:\\myfile.txt"));
String line;
while ((line = reader.readLine()) != null) {
// if (line.contains("CP_NG")) {
// found++;
// }
if (line.matches(".*CP_NG.*")) {
found++;
}
}
reader.close();
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("anzahl treffer:"+found);
}
}
while (my $in_line = <TRACEFILE>) {
2009-05-11T15:30:46 TaulmarillWas mir sofort in's Auge springt ist, dass du so wie das Script im Moment aussieht chomp() nicht brauchst.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#/usr/bin/perl use strct; use warnings; my $file='C:\myfile.txt'; # regexp vorkompilieren my $regexp=qx/CP_NG/o; # vernünftige Fehlermeldung open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; # vor der Schleife definieren # das redefine in der Schleife bremst aus my $found=0; my $in_line; while ($in_line = <TRACEFILE>) { # du willst doch alle Treffer in einer Zeile nicht nur einen oder? $found += $in_line =~ m/$regexp/g; } print "anzahl treffer: $found\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#/usr/bin/perl use strct; use warnings; my $chuncksize=10*1024*1024; # 10MB je größer je schneller my $file='C:\myfile.txt'; my $regexp=qx/CP_NG/o; open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; my $found=0; my $chunk; while (read(TRACEFILE, $chunk, $chuncksize)) { $found += $chunk =~ m/$regexp/g; } print "anzahl treffer: $found\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#/usr/bin/perl use strct; use warnings; my $shared=100; # 100 Zeichen Überschneidung my $chuncksize=10*1024*1024; my $file='C:\myfile.txt'; my $regexp=qx/CP_NG/o; open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; my $found=0; my $chunk; my $old; while (read(TRACEFILE, $chunk, $chuncksize)) { $chunk=$old+$chunk; $found += $chunk =~ m/$regexp/g; $old=substr($chunk,-$shared,$shared); $old =~ s/$regexp//g; } print "anzahl treffer: $found\n";
Pattern pat = Pattern.compile(...)
2009-05-11T16:10:42 nomoresecretsWelche Perl-Distribution auf Windows? Bei den meisten Linux-Distros ist Perl - wenn ich das richtig in Erinnerung habe - ohne Threads und wenn Du ActivePerl auf Windows hast, ist das mit Threads kompiliert. Das macht einiges aus!sooo und jetzt nochmal was zum flamen ...
unter linux ist es nochmal bedeutend schneller
Quote??? Wie das? Wie sieht Dein Code aus?(und das aufm langsameren rechner - werds gleich mal auf einen ebenbürtigen PC transferieren und dann mal den unterschied zwischen win32 und linux testen), da dauerts mit index() nur ~47s ABER!! er findet 10 Treffer weniger
Quotemy $regexp=qx/CP_NG/o;
2009-05-11T16:25:32 nomoresecretsQuotemy $regexp=qx/CP_NG/o;
bringt bei mir einen
Bareword found where operator expected
syntax error
fehler :/
2009-05-11T17:00:34 nomoresecretsDie Regex-Engine wurde für 5.10 komplett überarbeitet. Die dürfte etwas schneller sein. Wundert mich zwar etwas, dass das den "Thread-Nachteil" mehr als wett macht, aber ok...Windows hat Perl 5.10 (activeperl)
beide Linux haben 5.8.5
der WindowsPC und einer der Linux-PCs haben einen Intel C2Duo 6300 (also 2x1,86GHz) mit 2GB Ram hier braucht das Script unter Windows ~2:50 und unter Linux sogar ~3:30
2009-05-11T15:16:39 nomoresecretsHallo Leute,
das Ganze habe ich in Perl und Java (nich schlagen, war eher aus Interesse um belegen zu können wie toll doch Perl ist) umgesetzt
2009-05-11T17:02:00 nomoresecretsscheint dann doch eher an reiner cpu-leistung zu liegen
2009-05-11T16:25:58 pqwie man sieht, ist perl auf meinem linux-system drei bis viermal so schnell. (regex-variante).
ist also stark vom interpreter abhängig (und/oder von java, ich hab mit der 5er version getestet).
edit: s/fast//
2009-05-11T23:01:39 sid burnHast du die Benchmarks den öfters laufen lassen?
perl -e '$such="--TEST--"; for(0..(200*1024*1024)){ print chr(33+rand(90)); print "\n" if(rand(40)<2); print $such if(rand(1000)<5)}' > test.random.txt
Quote>$ ls -lh test.random.txt
-rw-rw---- 1 topeg topeg 210M 11. Mai 18:26 test.random.txt
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; my $file='test.random.txt'; # regexp vorkompilieren my $regexp=qr/--TEST--/o; # vernünftige Fehlermeldung open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; # vor der Schleife definieren # das redefine in der Schleife bremst aus my $found=0; my $in_line; while ($in_line = <TRACEFILE>) { $found++ while($in_line =~ m/$regexp/gc); #$found++ if($in_line =~ m/$regexp/); } print "Anzahl Treffer: $found\n";
Quote>$ time ./regexpfind.pl
Anzahl Treffer: 922896
real 0m15.530s
user 0m14.361s
sys 0m0.312s
Quote>$ time ./regexpfind.pl
Anzahl Treffer: 1010759
real 0m19.092s
user 0m17.133s
sys 0m0.392s
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; my $shared=100; # 100 Zeichen Überschneidung my $chuncksize=10*1024*1024; my $file='test.random.txt'; my $regexp=qr/--TEST--/o; open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; my $found=0; my $chunk; my $old=""; while (read(TRACEFILE, $chunk, $chuncksize)) { $chunk=$old.$chunk; $found++ while($chunk =~ m/$regexp/gsc); $old = substr($chunk,-$shared,$shared); $old =~ s/$regexp//gs; } print "anzahl treffer: $found\n";
Quote>$ time ./regexpfind2.pl
anzahl treffer: 1010759
real 0m3.076s
user 0m2.260s
sys 0m0.708s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*-core
description: Motherboard
product: MS-6570
vendor: MICRO-STAR INTERNATIONAL CO., LTD
physical id: 0
slot: External Cache
*-cpu
description: CPU
product: AMD Athlon(tm) XP 2700+
vendor: Advanced Micro Devices [AMD]
physical id: 4
bus info: cpu@0
version: 6.10.0
slot: Socket A
size: 2GHz
capacity: 2200MHz
width: 32 bits
clock: 166MHz
*-memory
description: System Memory
physical id: 1b
slot: System board or motherboard
size: 1GiB
capacity: 1536MiB
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
#!/usr/bin/perl use forks; # oder "use threads", # forks bringen hier die bessere Multiprozessorunterstützung denke ich. use strict; use warnings; my $shared=100; # 100 Zeichen Überschneidung my $chuncksize=10*1024*1024; # 10 MB my $file='/home/topeg/test.random.txt'; my $regexp=qr/--TEST--/o; # maximal 4 Prozesse das macht bei 10 MB pro Prozess 40 MB... my $threads=4; open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; my $found=0; my $chunk; my $old=""; my @running; my $pos=0; while (read(TRACEFILE, $chunk, $chuncksize)) { $chunk=$old.$chunk; # erstmal alle Prozesse erzeugen if(@running < $threads) { push(@running,get_thread($chunk)); } else { #auf einen Prozess warten ... $found+=$running[$pos]->join(); #neuen erzeugen ... $running[$pos]=get_thread($chunk); # einen weiter $pos++; # Liste wieder von vorne beginnen $pos=0 if($pos >= $threads); } $old = substr($chunk,-$shared,$shared); $old =~ s/$regexp//gs; } # auf die restlichen warten.... $pos=0; while($pos<$threads) { $found+=$running[$pos]->join(); $pos++; } print "anzahl treffer: $found\n"; exit(0); ############################################### # thread/prozess erzeugen sub get_thread { my $thread=threads->create(\&parse, shift); die "error create thread" unless(defined($thread)); return $thread; } # die Arbeit erledigen sub parse { my $found=0; my $chunk=shift; $found++ while($chunk =~ m/$regexp/gsc); $chunk=""; return $found; }
Quote>$ time ./regexpfind3.pl
anzahl treffer: 1010759
real 0m5.603s
user 0m3.844s
sys 0m1.596s
2009-05-11T17:07:32 topegmit dem Code:
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; my $file='test.random.txt'; # regexp vorkompilieren my $regexp=qr/--TEST--/o; # vernünftige Fehlermeldung open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; # vor der Schleife definieren # das redefine in der Schleife bremst aus my $found=0; my $in_line; while ($in_line = <TRACEFILE>) { $found++ while($in_line =~ m/$regexp/gc); #$found++ if($in_line =~ m/$regexp/); } print "Anzahl Treffer: $found\n";
bekomme ich:
$found++ while($in_line =~ m/$regexp/gco)
my $regexp=qr/--TEST--/o;
$chuncksize=100*1024;
Quote>$ time ./bin/regexpfind2.pl
anzahl treffer: 1010759
real 0m1.233s
user 0m0.828s
sys 0m0.392s
Quote>$ time grep -ic -- "--TEST--" test.random.txt
922896
real 0m0.784s
user 0m0.424s
sys 0m0.312s
2009-05-12T08:43:01 sid burnDaher benchmarken wir hier wirklich nur CPU und RAM.
Quote>$ su root
Passwort:
># sync && echo 3 > /proc/sys/vm/drop_caches
># exit
exit
>$ time ./bin/regexpfind2.pl
anzahl treffer: 1010759
real 0m4.104s
user 0m0.892s
sys 0m0.456s
>$ time ./bin/regexpfind2.pl
anzahl treffer: 1010759
real 0m1.251s
user 0m0.912s
sys 0m0.312s
>$
echo 3 > /proc/sys/vm/drop_caches