Schieter: Performante Möglichkeit einen String zu splitten

Hi..
Ich habe einen String den ich in mehrere Teile splitten möchte. Der String enthält aber keine Leerzeichen oder andere Zeichen, die man als Trenner benutzen könnte. Es sind einfach nur Zahlen- bzw. Buchstabenfolgen.
Es ist allerdings fest definiert, nach wieviel Zeichen der String gesplittet werden soll. Beispielsweise nach 5, dann wieder nach 2, dann nach 8 usw..

Ich habe das bisher mit substr realisiert. Gibt es eine performantere Methode das zu realisieren?

  1. Moin!

    Ich habe das bisher mit substr realisiert. Gibt es eine performantere Methode das zu realisieren?

    Warum fragst du nach der Performance?

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. hallo,

      da nimm doch einfach die funktion substr()
      das ist doch das was du brauchst , oder ?

      kai

      1. hallo,

        da nimm doch einfach die funktion substr()
        das ist doch das was du brauchst , oder ?

        kai

        o_0

        Die hab ich ja bisher benutzt, wie in meinem Post zu lesen ist...

    2. Warum fragst du nach der Performance?

      Wieso sollte ich nicht?

      1. Moin!

        Warum fragst du nach der Performance?
        Wieso sollte ich nicht?

        Weil man die Frage nach Performance in der Regel dann stellt, wenn selbige tatsächlich in der gegenwärtigen Programmierung zu einem Problem geworden ist. Vorher aber nicht!

        Wenn du also entgegen deiner Beschreibung nicht EINEN String hast, der zu spalten ist, sondern zehn Millionen, und das in zwei Sekunden erledigt sein soll, dann gibt es sicher Wege, das hinzukriegen - dabei wird PHP unter Umständen verlassen werden, und es verursacht Aufwand, die Lösung auszudenken und einzubinden, eventuell sind auch noch weitere, eventuell unüberwindliche Probleme zu berücksichtigen (kein Root-Server, Moduleinbindung nicht beliebig etc.)

        Das alles kann bei der Frage nach "mehr Performance" notwendig werden. Aber wenn es keinen Grund gibt, mehr Performance rauszukitzeln, kann man sich derartige Überlegungen ja auch sparen, und einfach "Nein, gibt keine bessere Methode" antworten.

        Bedenke: Jede Verbesserung einer allgemein arbeitenden Lösung (hier: substr-Funktion) bedeutet, eine Anpassung auf in der speziellen Situation bestehenden Randbedingungen vorzunehmen. Man erhält eine Speziallösung, die nur noch in einem ganz engen Umfeld das erledigt, was man will. Deshalb ist es nicht sinnvoll, einfach nur allgemein nach etwas "besserem" zu fragen, ohne alle Begleitumstände zu nennen.

        Und deshalb fragte ich, warum du mehr Performance willst.
         - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Hi Sven,

          Warum fragst du nach der Performance?
          Weil man die Frage nach Performance in der Regel dann stellt, wenn selbige tatsächlich in der gegenwärtigen Programmierung zu einem Problem geworden ist. Vorher aber nicht!

          das sehe ich ganz anders. Ich finde es in jeder Situation gut und richtig, sich darüber Gedanken zu machen, ob das gleiche Ergebnis nicht auch effizienter erreicht werden könnte. Meiner Meinung nach ist es die Pflicht jedes Programmierers, die ihm zur Verfügung stehenden Ressourcen so effizient und schonend wie möglich zu nutzen. Denn die Sorglosigkeit der Programmierer, die unbekümmerte Verschwendung von Ressourcen wie Speicherplatz und Rechenleistung ist es, die auch modernste Rechner nach kurzer Zeit in die Knie zwingt.

          Und man hat es ja nicht immer mit hochgezüchteten Maschinen im GHz-Bereich zu tun. Gerade Webserver laufen oft auch auf kleinen Embedded-Systemen mit geringer Rechenpower. Okay, da läuft dann vielleicht nicht gerade ein Apache mit PHP, aber es geht mir um die grundsätzliche Einstellung.

          Das alles kann bei der Frage nach "mehr Performance" notwendig werden. Aber wenn es keinen Grund gibt, mehr Performance rauszukitzeln, kann man sich derartige Überlegungen ja auch sparen, und einfach "Nein, gibt keine bessere Methode" antworten.

          Und genau das halte ich für unverantwortlich. Da wäre es ehrlicher und vernünftiger, eine Antwort im sinne von "Ja, aber" zu geben, etwa verbunden mit der Gegenfrage, wieviel Aufwand einem das Plus an Performance wert ist.

          Bedenke: Jede Verbesserung einer allgemein arbeitenden Lösung (hier: substr-Funktion) bedeutet, eine Anpassung auf in der speziellen Situation bestehenden Randbedingungen vorzunehmen.

          Nicht unbedingt. In C oder gar Assembler ist es durchaus an der Tagesordnung, dass man Funktionen intern optimiert, deren Schnittstelle und Geltungsbereich schon fest definiert ist. Eine Optimierung *darf* in so einem Fall keine Spezialisierung bedeuten und ist doch oft möglich.
          Manchmal sogar mit verblüffend wenig Aufwand.

          Schönen Tag noch,
           Martin

          --
          Alkohl ist ungesund,
          Rauchen ist schädlich,
          Sex ist unanständig
          - und die Erde ist eine flache Scheibe.
          1. Hallo.

            Meiner Meinung nach ist es die Pflicht jedes Programmierers, die ihm zur Verfügung stehenden Ressourcen so effizient und schonend wie möglich zu nutzen.

            Welcher Plicht räumst denn Vorrang ein? -- Die zur Verfügung stehenden Ressourcen zu einhundert Prozent auszunutzen, ist schließlich nicht schonend, kann jedoch sehr wohl höchst effizient sein.
            MfG, at

            1. Hallo,

              Meiner Meinung nach ist es die Pflicht jedes Programmierers, die ihm zur Verfügung stehenden Ressourcen so effizient und schonend wie möglich zu nutzen.
              Welcher Plicht räumst denn Vorrang ein?

              die Frage stellt sich nicht, denn diese beiden Ziele ergänzen sich gleichgerichtet. Effizienz heißt schließlich, mit minimalem Einsatz eine maximale (oder optimale) Wirkung zu erzielen.

              Die zur Verfügung stehenden Ressourcen zu einhundert Prozent auszunutzen, ist schließlich nicht schonend, kann jedoch sehr wohl höchst effizient sein.

              Nur wenn die Anwendung eine derart hohe (Wirk-)Leistung erfordert. Dann hat sich aber jemand bei der Auswahl oder Dimensionierung der zur Verfügung stehenden Mittel vergriffen. In vielen Fällen wird die Effizienz (der Wirkungsgrad) sogar schlechter, wenn man das verfügbare Potential zu 100% ausschöpft.

              Schönen Sonntag noch,
               Martin

              --
              Lieber Blödeleien als blöde Laien.
              1. Hallo.

                die Frage stellt sich nicht

                Daher helfe ich ihr ja auf die Sprünge.

                Effizienz heißt schließlich, mit minimalem Einsatz eine maximale (oder optimale) Wirkung zu erzielen.

                Danke, mir war bislang nicht bewusst, dass du nur diesen Teil meintest.

                Die zur Verfügung stehenden Ressourcen zu einhundert Prozent auszunutzen, ist schließlich nicht schonend, kann jedoch sehr wohl höchst effizient sein.

                Nur wenn die Anwendung eine derart hohe (Wirk-)Leistung erfordert. Dann hat sich aber jemand bei der Auswahl oder Dimensionierung der zur Verfügung stehenden Mittel vergriffen.

                Wenn die Ressourcen genau ausreichen, hat sich da jemand alles andere als vergriffen.

                In vielen Fällen wird die Effizienz (der Wirkungsgrad) sogar schlechter, wenn man das verfügbare Potential zu 100% ausschöpft.

                Ich meinte die Vielzahl der übrigen Fälle.
                MfG, at

        2. Moin!

          Warum fragst du nach der Performance?
          Wieso sollte ich nicht?

          Weil man die Frage nach Performance in der Regel dann stellt, wenn selbige tatsächlich in der gegenwärtigen Programmierung zu einem Problem geworden ist. Vorher aber nicht!

          Wenn du also entgegen deiner Beschreibung nicht EINEN String hast, der zu spalten ist, sondern zehn Millionen, und das in zwei Sekunden erledigt sein soll, dann gibt es sicher Wege, das hinzukriegen

          Wenn ich nur EINEN String hätte, würde ich mir dafür nicht extra ein Script basteln.
          Ich lese ca. 120.000 Strings aus einer Textdatei ein, splitte sie, fülle damit ein Array und puste die Daten dann in die DB.

          Und dass ich 120.000 Strings habe und nicht EINEN ist nicht entgegen meiner Beschreibung. Die Beschreibung war nur eben auf EINEN dieser Strings bezogen. Es ging ums Prinzip, also ob es eine sinnvolle Lösung zu substr gibt um EINEN (oder auch 120.000) String(s) zu trennen.

          1. Moin!

            Ich lese ca. 120.000 Strings aus einer Textdatei ein, splitte sie, fülle damit ein Array und puste die Daten dann in die DB.

            Na, das ist doch schon mal etwas mehr Info.

            Und dass ich 120.000 Strings habe und nicht EINEN ist nicht entgegen meiner Beschreibung. Die Beschreibung war nur eben auf EINEN dieser Strings bezogen. Es ging ums Prinzip, also ob es eine sinnvolle Lösung zu substr gibt um EINEN (oder auch 120.000) String(s) zu trennen.

            Die Frage nach der Performance erfordert eigentlich immer, dass man erstens mehrere Methoden hat, und diese dann in ihrer Geschwindigkeit testet und vergleicht.

            Wobei auch die Anwendung nur EINER einzigen PHP-Funktion wie z.B. substr() schon höchst unterschiedlich ausgestaltet werden kann und unterschiedliche Performance bringt.

            Wenn man den Thread zusammenfaßt: Es gibt substr(), es gibt preg_match_all(). Und eine gewisse Anzahl an Möglichkeiten, diese zwei Funktionen in PHP-Code einzubetten.

            - Sven Rautenberg

            --
            My sssignature, my preciousssss!
  2. Hallo,

    Gibt es eine performantere Methode das zu realisieren?

    nein.

    Gruß aus Berlin!
    eddi

  3. Hallo Schieter [tolles Pseudo! ;-)],

    Hi..
    Ich habe einen String den ich in mehrere Teile splitten möchte. Der String enthält aber keine Leerzeichen oder andere Zeichen, die man als Trenner benutzen könnte. Es sind einfach nur Zahlen- bzw. Buchstabenfolgen.
    Es ist allerdings fest definiert, nach wieviel Zeichen der String gesplittet werden soll. Beispielsweise nach 5, dann wieder nach 2, dann nach 8 usw..

    Ich habe das bisher mit substr realisiert. Gibt es eine performantere Methode das zu realisieren?

    preg_match_all() ist unter bestimmten Umständen schneller als substr(). Wie sich das in deinem Fall verhält, und ob es überhaupt Sinn macht, diese Funktion einzusetzen, kann ich (mangels ausführlicherer Angaben) allerdings nicht sagen. Aber du könntest das ja selbst mit einem Vergleich rausfinden.

    MffG
    EisFuX

    --
    Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
    Stanisław Lem
    1. Hallo,

      Es ist allerdings fest definiert, nach wieviel Zeichen der String gesplittet werden soll. Beispielsweise nach 5, dann wieder nach 2, dann nach 8 usw..

      preg_match_all() ist unter bestimmten Umständen schneller als substr(). Wie sich das in deinem Fall verhält, und ob es überhaupt Sinn macht, diese Funktion einzusetzen, kann ich (mangels ausführlicherer Angaben) allerdings nicht sagen. Aber du könntest das ja selbst mit einem Vergleich rausfinden.

      es ist deutlich beschrieben worden und mit preq_match_all() kommst Du der Lösung des gestellten Probem so rein gar nicht bei.

      Gruß aus Berlin!
      eddi

      1. Hallo eddi,

        ... Wie sich das in deinem Fall verhält, und ob es überhaupt Sinn macht, diese Funktion einzusetzen, kann ich (mangels ausführlicherer Angaben) allerdings nicht sagen. Aber du könntest das ja selbst mit einem Vergleich rausfinden.
        es ist deutlich beschrieben worden ...

        Naja, besonders deutlich ist das für mich noch nicht gewesen:

        Es ist allerdings fest definiert, nach wieviel Zeichen der String gesplittet werden soll. Beispielsweise nach 5, dann wieder nach 2, dann nach 8 usw..

        Ich lese ca. 120.000 Strings aus einer Textdatei ein, splitte sie, fülle damit ein Array und puste die Daten dann in die DB.

        ... und mit preq_match_all() kommst Du der Lösung des gestellten Probem so rein gar nicht bei.

        Ich halte deine Antworten hier im Forum im Allgemeinen für kompetent, aber nur, weil du keine derartige Lösung kennst, heißt das nicht, dass es sie nicht gibt.

        preg_match_all() macht genau das, was Schieter beschrieben hat: Einen String in ein Array aufsplitten. Der Ansatz könnte so funktionieren:

          
        $input = ... ; // der Ausgangsstring  
        $split_len = 8; // Länge der Teilstrings  
        preg_match_all('/.{1,' . $split_len . '}/s', $input, $rx_matches);  
          
        // jetzt hast du in $rx_matches die Teilstrings als Array:  
        print_r($rx_matches);  
        
        

        Die Sache hat nur den Haken, dass die Teilstrings nie länger als 65536 Zeichen sein dürfen. Zumindest ist das von der verwendeten PCRE-Version abhängig.

        Unter PHP5 könnte übrigens auch str_split() eine Alternative zu substr() sein.

        MffG
        EisFuX

        --
        Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
        Stanisław Lem
        1. Hallo,

          Die Sache hat nur den Haken, ...

          ich würde meine, die Sache hat zwei Haken. Denn alle Strings sind nun gleichlang, was sie nach Beschreibung nicht sein sollen. Dies trifft auch auf str_split() zu.

          Gruß aus Berlin!
          eddi

          1. Die Sache hat nur den Haken, ...

            ich würde meine, die Sache hat zwei Haken. Denn alle Strings sind nun gleichlang, was sie nach Beschreibung nicht sein sollen. Dies trifft auch auf str_split() zu.

            Das meinte ich mit "nicht ausreichender Beschreibung". Zumindest für mich war das im OP nicht auf Anhieb eindeutig zu erkennen. Es spricht aber nichts dagegen, den regulären Ausdruck um die anderen "Längen" zu erweitern.

            MffG
            EisFuX

            --
            Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
            Stanisław Lem
            1. ich würde meine, die Sache hat zwei Haken. Denn alle Strings sind nun gleichlang, was sie nach Beschreibung nicht sein sollen. Dies trifft auch auf str_split() zu.

              Das meinte ich mit "nicht ausreichender Beschreibung".

              Ich finde das eigentlich ausreichend:

              Es ist allerdings fest definiert, nach wieviel Zeichen der String gesplittet werden soll. Beispielsweise nach 5, dann wieder nach 2, dann nach 8 usw..

              Das bedeutet für mich, dass der String mal "nach 5, dann wieder nach 2, dann nach 8 usw." gesplittet werden soll.

              1. Moin!

                Es ist allerdings fest definiert, nach wieviel Zeichen der String gesplittet werden soll. Beispielsweise nach 5, dann wieder nach 2, dann nach 8 usw..
                Das bedeutet für mich, dass der String mal "nach 5, dann wieder nach 2, dann nach 8 usw." gesplittet werden soll.

                Und würde sich als regulärer Ausdruck so ergeben:
                ^(.{5})(.{2})(.{8})$

                Ob man den jetzt durch preg_match oder preg_match_all jagen muß, wäre noch zu untersuchen, preg_match könnte schon ausreichen.

                - Sven Rautenberg

                --
                My sssignature, my preciousssss!
              2. Hallo Schieter,

                Es ist allerdings fest definiert, nach wieviel Zeichen der String gesplittet werden soll. Beispielsweise nach 5, dann wieder nach 2, dann nach 8 usw..
                Das bedeutet für mich, dass der String mal "nach 5, dann wieder nach 2, dann nach 8 usw." gesplittet werden soll.

                Für mich gab es nach der "ersten Lesung" noch eine zweite Deutungsmöglichkeit: Du willst ca. 120_000 Strings in Teile zerhacken -- und zwar mal einen in Teile zu 5, dann einen in Teile zu 2 Zeichen usw. ... Diese Missdeutung kann durchaus auf nicht 100-prozentig aufmerksames Lesen durch meine Person zurückzuführen sein - also sei's drum ...

                Jedenfalls kam dadurch mein Vorschlag mit preg_match_all() zu Stande. Für den von dir beschriebenen Fall geht das natürlich auch mit der einfachereren Variante, mit preg_match().

                Nebenbei können preg_match() und Co. mit dem passenden Modifikator auch UTF-8-Strings an der richtigen Stelle teilen. Bei substr() bin ich mir da nicht so sicher.

                Stellt sich jetzt nur noch die Frage, ob das Ganze wirklich sooo viel schneller abläuft ...

                MffG
                EisFuX

                --
                Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
                Stanisław Lem