Split() langsam

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Split() langsam

    Hallo!

    Ich habe eine Textbox-Control mit etwas mehr (ca. 2,2 Mio. Zeilen = ca. 45 MB Daten) und die lasse ich mittels Split() nach einem Zeichen aufteilen. Das dauert eine halbe Ewigkeit. Wenn ich das selbe mit Autoit nachstelle, dauert es ca. zwei bis drei Sekunden, auch mit dem "alten" VB 6 ging das selbe in einem Beruchteil der Zeit. Kann das sein? Visual Studio 2012 auf einem Intel QuadeCore Q6600 mit 4GB Ram...

    Im Grunde mache ich nur ein

    Quellcode

    1. aData = Split(txtInput.Text, "#")


    Ein txtInput.Text.Length ergibt 44920255 und das Trennzeichen ist 2.178.738 mal in dem Test vorhanden, ich finde das jetzt ehrlich gesagt nicht so viele Daten für die PC heutezutage.

    Irgendwelche Tipps, was ich verkehrt mache oder ist vb.net in dem Fall echt so lahm?

    Danke!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „hausl78“ ()

    Quellcode

    1. Dim MyList As List(Of String) = Split(txtEDIInput.Text, "'").ToList


    (Originalcode, das Trennzeichen ist das Hochkomma, hab vorher plakativ das # genommen weil es besser lesbar ist hier.)

    Der meckert, sorry weiß nicht was ich da tun muss...



    Wenn ich das erste mache "Importiere..." dann kommt ein Folgefehler..

    Quellcode

    1. "ToList ist kein Member von System.Array"


    Ich habe Option Strict und Explicit beide auf "On".
    Ich habe folgenden Pseudocode.
    Aber die Geschwindigkeit ist immer noch schlecht.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim Test As New System.Text.StringBuilder(50000000)
    3. For i As Integer = 1 To 200000 '200'000
    4. Dim Test2 As New System.Text.StringBuilder(25)
    5. For j As Integer = 1 To 24
    6. Test2.Append("A"c)
    7. Next
    8. Test.Append(Test2.ToString & "#")
    9. Next
    10. TextBox1.Text = Test.ToString
    11. Debug.WriteLine("Textlänge: " & TextBox1.Text.Length)
    12. Debug.WriteLine("Starte Split: " & Now.ToString("HH:mm:ss"))
    13. Dim MyList As List(Of String) = Split(Test.ToString, "#").ToList
    14. Debug.WriteLine("End of Split: " & Now.ToString("HH:mm:ss"))
    15. End Sub


    Je nach PC dauert das bei mir zwischen 1-5 Sekunden.
    In AutoIt dauert das Gleiche etwa 0.3 Sekunden........
    @faxe1008
    Du warst zu schnell.
    Habs gerade vor zwei Minuten gesehen. Das andere war ja VB6 Code.
    In VB.NET muss es ja TextBox1.Text.Split("#"c).ToList sein.

    Trotzdem danke!

    Also so:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim Test As New System.Text.StringBuilder(50000000)
    3. For i As Integer = 1 To 200000 '200'000
    4. Dim Test2 As New System.Text.StringBuilder(25)
    5. For j As Integer = 1 To 24
    6. Test2.Append("A"c)
    7. Next
    8. Test.Append(Test2.ToString & "#")
    9. Next
    10. TextBox1.Text = Test.ToString
    11. Debug.WriteLine("Textlänge: " & TextBox1.Text.Length)
    12. Debug.WriteLine("Starte Split: " & Now.ToString("HH:mm:ss"))
    13. Dim MyList As List(Of String) = Test.ToString.Split("#"c).ToList
    14. Debug.WriteLine("End of Split: " & Now.ToString("HH:mm:ss"))
    15. End Sub

    Muss bitte kurz nochwas etwas fragen.. Wenn ich in der Zwischenablage viel Text habe und das zB im UltraEdit mittels STRG+V einfüge dann geht das quasi "sofort", wenn ich in meiner txtBox COntrol ein STRG+V mache, dann dreht der "Bitte-Warten-Cursor" ca. 2-3 Sekunden und dann ist es erst ersichtlich. Kann ich da auch nohcwas machen? Irgend ein Schalter der dahingehend was bewirken könnte?

    Danke!
    böse Funktionen vermeiden

    Das Split, was du zuerst verwendet hattest, ist aus dem genannten bösen Namespace.
    Interessant, dasses nicht nur schlechter designed ist, sondern auch noch eklatant langsamer.

    Edit: WinForms-Controls kommen nicht an in C++, C oder gar abschnittsweise Assembler geschriebene hochoptimierte Editoren heran.
    Ist auch nicht nötig - denk lieber mal übers Anwendungs-Design nach - du wirst deinen Usern doch keinen 40MB Text vorsetzen wollen :thumbdown:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Wenn ich zB nur einen normalen String habe, dann kann ich aber das "gute" Split nicht verwenden, oder? Beispiel ins Blaue getippt:

    VB.NET-Quellcode

    1. dim sTest as String = "Ich bin ein String"
    2. ' wie könnte ich hier splitten? Ich kanns nur so:
    3. dim aTest() as string = split(sTest, " ")
    4. ' weil ein sTest.split geht ja nicht.


    Für das obige muss ich den String ja dann irgendwie in ein Objekt bekommen, oder?
    Das Obige ist bereits ein Object vom Typ String.

    VB.NET-Quellcode

    1. Dim a As String() = "Ich bin ein String".Split(" "c)


    Aktiviere außerdem Option Strict.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    ein String ist doch ein Objekt - was sonst?
    Es geht sogar so:

    VB.NET-Quellcode

    1. dim sTest as String = "Ich bin ein String"
    2. dim aTest = sTest .Split(" "c)
    3. 'oder annere Überladung:
    4. aTest = sTest .Split()
    5. 'oder:
    6. aTest = "Ich bin ein String".Split()
    Grundlagen: dieses Buch lesen (hingegen das Galileio-Openbook ist Mist)

    VB.NET-Quellcode

    1. Dim A As String = "Hallo Welt"
    2. Dim B As String() = A.Split(" "c)

    Übrigens sollte man die Schreibweise "B As String()" der Schreibweise "B() As String" vorziehen. Denn der Typ ist String(), also ein String-Array. "B() As String" wird ganz besonders bei Properties zum Problem:

    VB.NET-Quellcode

    1. Public Property Text() As String

    Quiz-Frage: Welchen Typ hat die Property? String oder String-Array?

    Noch übrigenser:
    Die List(Of T)-Klasse hat einen Konstruktor, der ein IEnumerable(Of T) entgegen nimmt. Und alle Auflistungen in .Net implementieren das Interface. Deshalb kann man schreiben:

    VB.NET-Quellcode

    1. Dim Foo As New List(Of String)(Bar.Split("#"c))

    Wenn man das denn überhaupt möchte. Erscheint mir ein bisschen komisch, extra 'ne Liste draus zu machen, denn die ist in erster Linie dazu gedacht, Elemente nach und nach hizuzufügen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    SpaceyX schrieb:

    Aktiviere außerdem Option Strict.


    Strict und Explicit sind bereits aktiv

    ErfinderDesRades schrieb:

    ein String ist doch ein Objekt - was sonst?


    Also ich komme aus der PHP Ecke (und bisschen Autoit) und bei PHP ist ein Object was ganz anderes als ein String. Ich habe das letzte mal so richtig mit VB 6 in VB was gemacht, sehe schon, da hat sich "etwas" getan *hust*

    Niko Ortner schrieb:

    Übrigens sollte man die Schreibweise "B As String()" der Schreibweise "B() As String" vorziehen
    ...
    Quiz-Frage: Welchen Typ hat die Property? String oder String-Array?


    Habe ich geändert. Warum man ein Array als String "dim-men" muss (kann) ich mir übrigens nach wie vor nicht klar. EIn String ist ein Datentyp wie ein Integer etc.. und ein Array eine - sagen wir mal nicht skalare Speicherform die selbst Integer, Strings etc.. enthalten kann.. aber anderes Thema.

    Gibt es übrigens für mein "Paste" (STRG+V) Phänomen noch ev. eine Theorie?

    Danke!

    ErfinderDesRades schrieb:

    sowohl in c# als auch in vb.net.
    Klein geschrieben nicht, damit es nicht "by reference" sodern "by value" ist, was ich nur Vernünftig finde. :)

    Edit: Ne, macht irgendwie kein unterschied, is ja komisch ?( .

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bluespide“ ()