Schrift
[thread]7840[/thread]

schnelleres OpenDir

Leser: 2


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
master
 2006-03-30 13:32
#64181 #64181
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
In letzter Zeit stiess ich vermehrt auf die Methode A, um
die lästigen "." und ".." zu entfernen. Nun habe ich mal getestet ob meine bewährte Methode B, schneller ist.

Methode A = sub a;
Methode B = sub b;
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
use FindBin qw($Bin); chdir($Bin);

$t=time;
for(1..150000)
{
    #&a;
        &b;
}
$zeit = time - $t;
print "Zeit: $zeit\n";



sub a
{
     opendir(DIR,'t') or die $!;
       @files = grep{$_ !~ /^\.\.?$/}readdir(DIR);
       closedir DIR;
}

sub b
{
   opendir(DIR,'t') or die $!;
   @files = readdir(DIR);
   closedir DIR; shift(@files);shift(@files);
}



Methode A: 76 Sekunden (bei weniger durchläufen 38s)
Methode B: 69 Sekunden (bei weniger durchläufen 34s)

"Methode B" ist ca. 10 % schneller.\n\n

<!--EDIT|master|1143711174-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
renee
 2006-03-30 13:37
#64182 #64182
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es muss dann aber sichergestellt sein, das '.' und '..' auch wirklich am Anfang des Arrays stehen! Es wäre ja auch denkbar, dass andere Einträge am Anfang stehen und dann hast Du mit Methode 'B' ein Problem.
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/
master
 2006-03-30 13:42
#64183 #64183
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Die stehen immer zuerst drin...

Es ist logisch, das das sub und root verzeichnis nicht
per zufall sondern immer stehts als erste element eingefügt werden.

Bis jetzt bin ich nie auf einen Fall gestossen, bei dem Methode B nicht funktionierte..\n\n

<!--EDIT|master|1143712122-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
renee
 2006-03-30 13:56
#64184 #64184
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ist das bei jedem OS so vorgegeben?? Ich weiß, dass es so üblich ist, ist es aber irgendwo so festgeschrieben, dass es so sein *muss*?
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/
master
 2006-03-30 15:32
#64185 #64185
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Nun, das nicht...
Aber ich vermute die routine von "opendir" bzw. "readdir" ist so prorgrammiert.

Wäre noch interessant, mal den Quellcode von Perl zu sichten dafür. Jedenfalls schreiben auch alle Quellen, das ".." und "." vorkommt.
Kommt es in Perl selbst so vor (fest programmierter Ablauf)

1. Gib mir root usw.
2. Rest

Dann wirds überall so sein. Jedenfalls ist es mühsam alle einträge zuerst durchsehen zü müssen. Ich vermute nicht das der Entwickler hier das nach obigem schema aufbaut.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
renee
 2006-03-30 17:12
#64186 #64186
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich wollte nur darauf aufmerksam machen, dass es nicht unbedingt das gleiche Resultat liefert. Natürlich kannst Du das in (wahrscheinlich) 99% aller Fälle auch nach Methode B machen.
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/
pq
 2006-03-30 17:40
#64187 #64187
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
[quote=master,30.03.2006, 13:32]Aber ich vermute die routine von "opendir" bzw. "readdir" ist so prorgrammiert.[/quote]
das hängt vom betriebssystem ab. readdir/opendir sind nicht in Perl geschrieben.
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
sid burn
 2006-03-30 18:18
#64188 #64188
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
EDIT: Okay hat sich erledigt, ich sollte die Beiträge mal vorher besser lesen, du wolltest ja nur "." und ".." entfernen und nicht alle Dateien die mit "." oder ".." anfangen.

-------------

Hi,
warum kein glob Benutzen? Ich bekomme folgende Werte:

A: Zeit: 64
B: Zeit: 33
C: Zeit: 2

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
#!/usr/bin/perl -w

$home = "/home/sidburn/";

$t=time;
for(1..150000)
{
# &a;
# &b;
&c;
}
$zeit = time - $t;
print "Zeit: $zeit\n";



sub a
{
opendir(DIR,$home) or die $!;
@files = grep{$_ !~ /^\.\.?$/}readdir(DIR);
closedir DIR;
}

sub b
{
opendir(DIR,$home) or die $!;
@files = readdir(DIR);
closedir DIR; shift(@files);shift(@files);
}

sub c
{
glob("$home*");
}


Allerdings soweit ich gelesen habe ist glob erst ab Perl 5.8 Optimiert, vor Perl 5.8 sollte man lieber opendir/closedir benutzen. Ich hoffe jedenfalls das es die Version 5.8 war.\n\n

<!--EDIT|sid burn|1143728771-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
master
 2006-03-30 18:31
#64189 #64189
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Naja...
Zum einen weils hier um opendir ging...

Zum anderen -> Glob gibt den ganzen Pfad zur Datei zurück..
nicht nur den Dateinamen.

Und ich benötige meist nur letzteres.
oder weisst du wie ich das erreiche?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
sid burn
 2006-03-30 18:40
#64190 #64190
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=master,30.Mar..2006, 16:31]Naja...
Zum einen weils hier um opendir ging...

Zum anderen -> Glob gibt den ganzen Pfad zur Datei zurück..
nicht nur den Dateinamen.

Und ich benötige meist nur letzteres.
oder weisst du wie ich das erreiche?[/quote]
Vorher mit chdir in das Verzeichnis wechseln und dann das glob ausführen.

chdir $home;
@d = glob(*);

Dann bekommst du auch nur die Dateien angezeigt.


Allerdings teste ich gerade, wenn du das machst und auch noch eine regex darauf anwendest, wird es langsamer als die opendir Variante.

Hab auch nochmal nachgeschaut, glob war vor Perl 5.6 langsam weil es dort immer /bin/csh aufgerufen hat, was aber nun nicht mehr der Fall sein soll.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-03-30 13:32.