Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Dateiendung am schnellsten extrahieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Dateiendung am schnellsten extrahieren

    Es gibt ja viele Möglichkeiten, mit denen man eine Dateiendung aus einem String extrahieren kann.
    Ich bin zum Beispiel auf zwei String- und eine Array-Explode-Möglichkeit gestossen.

    Ein kurzer Test ergibt folgendes:
    PHP-Code:
    <?php

        $file 
    "/www/virtual/some/path/to/file.jpg";

        
    $start microtime();

        echo 
    "Test 1: explode<br />";

        for(
    $i=0$i<10000$i++)
            
    $ext strtolower(end(explode("."$file)));

        
    $end microtime();

        echo (
    $end $start)."<br /><br />";

        echo 
    "Test 2: strpos<br />";

        for(
    $i=0$i<10000$i++)
            
    $ext substr($filestrrpos($file'.') + 1);

        
    $end microtime();

        echo (
    $end $start)."<br /><br />";

        echo 
    "Test 3: strrchr<br />";

        for(
    $i=0$i<10000$i++)
            
    $ext substr(strrchr($fileName'.'), 1);

        
    $end microtime();

        echo (
    $end $start)."<br /><br />";

    ?>
    Test 1: explode
    0.099626

    Test 2: strpos
    0.132479

    Test 3: strrchr
    0.190867
    Die Array-Variante ist deutlich schneller. Gilt das generell für das Bearbeiten von Strings mit Array-Funktionen?

    Gibt es eine noch schnellere Möglichkeit?

  • #2
    Zitat von chunky Beitrag anzeigen
    Ein kurzer Test ergibt folgendes:
    OK, jetzt bitte Hirn anschalten.


    Du ermittelst die Endzeitpunkte der jeweiligen Operation - und ziehst aber von allen den selben Startzeitpunkt ab.

    Ausserdem liefert microtime ohne true für den Parameter einen Wert, mit dem du gar nicht sinnvoll rechnen kannst.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Oh, ja. Mist.
      Jetzt machen die Ergebnisse auch mehr Sinn. Hätte mich gewundert, wenn der Array-Explode schneller gewesen wäre.

      Test 1: explode
      0.0678458213806

      Test 2: strpos
      0.0321960449219

      Test 3: strrchr
      0.0542099475861

      Kommentar


      • #4
        Wieso verwendest du in der 1. Variante noch strtolower und in den anderen nicht? Das verfälscht das Ergebnis auch würde ich sagen. Außerdem sind die Geschwindigkeitsunterschiede wohl marginal und sind daher eigentlich uninteressant.

        Kommentar


        • #5
          Die Werte sind Absolut gesehen zwar sehr nah zusammen, aber trotzdem ist strpos mehr als 100% schneller als explode. Is zwar jetzt für die Geschwindigkeit eines Seitenaufrufes nicht wirklich interessant aber die Serverlast kann es schon beeinflussen.

          Kommentar


          • #6
            Wobei ich auch nie auf die Idee gekommen wäre, das mit explode() zu lösen.
            [I]Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)[/I]
            [I]Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)[/I]

            Kommentar


            • #7
              Man könnte natürlich auch einfach eine Funktion benutzen, die dafür gedacht ist. [MAN]pathinfo[/MAN] z.B. Aber das wäre ja zu einfach.
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Zitat von nikosch Beitrag anzeigen
                Man könnte natürlich auch einfach eine Funktion benutzen, die dafür gedacht ist. [MAN]pathinfo[/MAN] z.B. Aber das wäre ja zu einfach.
                Wenn ich den Test des TE um pathinfo erweitere, ist das allerdings die langsamste Variante.
                [I]Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)[/I]
                [I]Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)[/I]

                Kommentar


                • #9
                  Sie liefert ja auch mehr. Dafür ist sie die "semantischste".
                  PHP-Code:
                  $file "/www/virtual/some/path/to/file.jpg";

                  $ext pathinfo ($file PATHINFO_EXTENSION);

                  // vs.

                  $ext strtolower(end(explode("."$file)));

                  // gut, dass ext davorsteht. 
                  Ginge übrigens auch noch:

                  PHP-Code:
                  $ext ltrim (strrchr($fileName'.'), '.'); 
                  [COLOR="#F5F5FF"]--[/COLOR]
                  [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                  [COLOR="#F5F5FF"]
                  --[/COLOR]

                  Kommentar


                  • #10
                    Gibt es eine noch schnellere Möglichkeit?
                    There are many ways to do it.

                    PHP-Code:
                    $ext preg_match('/(?<=\.)[^.]+\z/'$file$hits) ? $hits[0] : ''
                    Wen interessiert, ob diese Variante schneller ist?
                    Sie funktioniert, ist leichter erweiterbar als die anderen und besser verständlich ist sie auch ...
                    Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                    Kommentar


                    • #11
                      Beim benchen von regex sollte man dann aber immer beachten dass php nen cache für das parsen von regex hat, sprich, das XXXX mal in einer schleife in einem script bzw. hintereinander ausführen wird sehr wahrscheinlich zu anderen ergebnissen führen wie es dann in der realität aussieht.

                      PHP: Introduction - Manual

                      Note: This extension maintains a global per-thread cache of compiled regular expressions (up to 4096).
                      [URL="http://www.robo47.net"]robo47.net[/URL] - Blog, Codeschnipsel und mehr
                      | :arrow: [URL="http://www.robo47.net/blog/192-Caching-Libraries-and-Opcode-Caches-in-php-An-Overview"]Caching-Klassen und Opcode Caches in php[/URL] | :arrow: [URL="http://www.robo47.net/components"]Robo47 Components - PHP Library extending Zend Framework[/URL]

                      Kommentar


                      • #12
                        Zitat von fireweasel Beitrag anzeigen
                        Sie funktioniert, ist leichter erweiterbar als die anderen und besser verständlich ist sie auch ...
                        Was willst du denn erweitern, wenn es um die Dateiendung geht?
                        Besser verständlich als pathinfo()?

                        Naja, der TE dürfte jetzt genug Infos haben
                        [I]Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)[/I]
                        [I]Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)[/I]

                        Kommentar


                        • #13
                          Zitat von dennis81 Beitrag anzeigen
                          Was willst du denn erweitern, wenn es um die Dateiendung geht?
                          Besser verständlich als pathinfo()?
                          Nur bestimmte Dateiendungen erfassen?
                          Das Verhalten, wenn keine Dateiendung vorhanden ist (also kein Punkt)?
                          Das Verhalten, wenn mehrere Dateiendungen vorhanden sind?
                          (Sowas wie "dumm.di.dumm.dei")

                          Nur mal so als Beispiel -- in allen Fällen dürfte pathinfo() eher nutzlos sein. Es betreibt eh nur Stringmanipulation, echte Datei-Pfad-Extraktion ist von Betriebssystem zu Betriebssystem (und Filesystem zu Filesystem) unterschiedlich.

                          Naja, der TE dürfte jetzt genug Infos haben.
                          Gerade wollte ich von den Vorzügen schwärmen, die strtok() so hat ...
                          Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                          Kommentar

                          Lädt...
                          X