Geschwindigkeit usw...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 76 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    Geschwindigkeit usw...

    Moin moin

    Habe da mal eine Frage bevor ich weiter mache.
    Gibt es einen gravierenden Unterschied, was die Geschwindigkeit etc und andere Faktoren, welche ich evtl nicht kenne?
    Welche Variante wäre die "bessere", gerade wenn es sich um USB-Festplatten etc handelt.


    Diese Variante:

    ZipFile.CreateFromDirectory(Source, Target & ".zip", CompressionLevel.Optimal, False)

    oder diese und erst dann das Verzeichnis zippen

    My.Computer.FileSystem.CopyDirectory(Source, Target)


    Wie ist es, wenn man 2 BGW zur gleichen Zeit einsetzt?
    Beispiel, ich möchte auf 2 Festplatten gleichzeitig kopieren.

    Danke :rolleyes:
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Das effektivste wäre wohl: Selber probieren und Zeit messen. Es ist Dein PC.
    Solche Sachen einfach selbst probieren. Geht schneller als im Forum zu posten. Klar gibt es Situationen, in denen man eine Forumsfrage stellen sollte, aber vergleichende Geschwindigkeitsmessungen gehören m.E. da nicht dazu.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich habe hier für mich so lange drauf herumsiniert... @VaporiZed hat es dann einfach so geschrieben :)
    Ja das war auch mein Gedanke, man baut sich einfach seine Testumgebung dafür, also eher Zenarien und misst.
    Aber rein als Gedankenexperiment würde ich annehmen, dass es am schnellsten sein müsste, wenn ich Quelle und Ziel ohne Zwischenstopp auf anderen Medien lesen und schreiben würde. Also einlesen als Stream und wieder ausgeben. Weil so oder so, du kommst nicht drumm herum jede Quelldatei mindestens einmal zu lesen und das Ziel (Archiv) einmal zu schreiben. Alles dazwischen sollte lediglich der Arbeitsspeicher deines Rechners sein.
    @VaporiZed und @Dksksm

    Es geht mir dabei nur darum ob es programmiertechnisch Unterschiede macht und wie viel Sinn oder Unsinn es ist, 2 Backgroundworker laufen zu lassen.
    Mir ist schon Bewusst, das es letztendlich am jeweiligen PC liegt oder an den Festplatten, USB1 oder USB3
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    1.) Es gibt schnelle und langsame USB-Festplatten. Je teurer, desto schneller (i.d.R.)
    1.1) Aber selbst wenn du eine sehr schnelle Platte hast, kann es sein, dass dein PC einfach nicht schneller kann.
    2.) Es kommt auf die Programmiersprache an. C++ ist schneller als VB.NET. Nun gut, du willst ja in VB.NET programmieren und nicht in C++, ist mir schon klar, ich wollte es der Vollständigkeit halber erwähnt haben. Das VB.NET-eigene File.CopyTo() ruft erst Windows' Kopierfunktion auf.
    3.) Es kommt auf das Betriebssystem an. Wenn Windows gerade meint, Updates ziehen zu müssen und nebenbei streamst du außerdem TV, wird das Kopieren langsamer sein, als wenn der PC sonst nichts zu tun hat.

    Die Anderen haben es schon gesagt: Selbst testen. Und mach dir keine Gedanken über die letzte Nachkommastelle. Ich habe einst ausprobiert, wie es sich verhält, wenn man einen UInt16 ein paar Tausend Mal inkrementiert, einen UInt32 und einen UInt64. Der Unterschied lag bei wenigen Ticks (also nicht mal Millisekunden, sondern Taktzyklen des Prozessors). Aber auch der Unterschied war so gering – und teilweise so widersprüchlich manchmal – dass ich das gar nicht interpretieren konnte. Und das ist das Ding. Tagesformabhängig.

    Edit: Ich sehe gerade, du hast in der Zwischenzeit geantwortet.

    Amelie schrieb:

    Backgroundworker
    sind old stuff. Dafür gibt es Async/Await. Aber das hatten wir schon mal.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Bitte bitte keinen Backgroundworker, das ist mehr als outdated. Async Await, was @VaporiZed schon vorgeschlagen hat, ist die Wahl der Mittel und es ist gar nicht schwer umzusetzen.
    Allerdings, meiner Erfahrung nach auch mit anderen Werkzeugen, das Kopieren von Dateien macht paralell einfach keinen Sinn. Du brauchst unterm Strich die selbe Zeit, ob du hintereinander deine Kopien machst oder mehrere Paralell. Nun kann es in deiner Konstellation sein (2 verschiedene Ziele), dass das paralelle Kopieren etwas schneller geht, wenn nämlich deine Quelle deutlich schneller liefert als deine Ziele schreiben können.

    So oder so würde ich Async/Await einsetzen, weil Kopiervorgänge brauchen eben ihre Zeit und man möchte heutzutage einfach nicht gerne, wenn die Oberfläche, also dein Programm, so wirkt als wäre es abgestürzt, weil "Antwortet nicht mehr". Für mich ist gerade die "Reakationsfähigkeit" der GUI der wesentliche Aspekt.
    Ich gugge und lese gerade über Task / Thread und async. Leider gibts da wieder nur 99% in C#.. und leider wird nicht so richtig erklärt was ein Task und was ein Thread ist.

    @VaporiZed
    Das mit dem BGW habe ich verstanden und weil ich so ein kleines Prog habe was mit 2 BGW arbeitet, möchte ich das nun entsprechend "umbauen" oder besser ganz neu coden. ;)

    @Dksksm
    Also definitiv wird die Quelle eher sehr langsam sein, USB-Stick oder SDKarte. Die Festplatten sind dann USB3 und eine Interne SSD



    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Amelie“ ()

    Das mit Async/Await an einem ganz einfachen Beispiel erklärt:

    VB.NET-Quellcode

    1. Private Async Sub Methode1() 'hier ist das Async wichtig
    2. 'hier kommt normaler Code hin, der ausgeführt werden soll, bevor X ausgeführt wird.
    3. Await Threading.Tasks.Task.Run(Sub() Methode2) 'X wird ausgeführt; gleichzeitig wird die Methode1 vorerst (!) beendet und das Programm läuft normal weiter
    4. 'hier kommt der Code hin, der ausgeführt werden soll, wenn X fertig ist; das Programm bekommt das selber mit und macht hier eben wieder weiter.
    5. End Sub
    6. Private Sub Methode2
    7. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    OK, soweit habe ich das, denke ich verstanden.
    Nur in meinem Fall mit den beiden Threads wie ich das Beispiel gezeigt habe, sollen ja beide gleichzeitig laufen.
    Oder macht das ggf den Unterschied aus, das dass "zippen" und "kopieren" dann eben doch schneller abläuft?

    Habe eben in einem englishen Tutorial (c#) gehört das es nicht immer Sinn macht alles in verschiedene Threads / Tasks ( was ist der Unterschied?? ) zu legen???


    Oder So?

    VB.NET-Quellcode

    1. Private Async Sub Methode1()
    2. Dim zippe As Threading.Thread = New Threading.Thread(AddressOf zippen)
    3. Dim kopie As Threading.Thread = New Threading.Thread(AddressOf kopieren)
    4. Await Threading.Tasks.Task.Run(Sub() Methode2)
    5. End Sub
    6. Private Sub Methode2
    7. zippe.Start()
    8. kopie.Start()
    9. End Sub
    10. Private Sub zippen()
    11. IO.Directory.CreateDirectory(Klass.HDD2temp)
    12. ZipFile.CreateFromDirectory(Klass.Source, Klass.HDD2temp & ".zip", CompressionLevel.Optimal, False)
    13. End Sub
    14. Private Sub kopieren()
    15. My.Computer.FileSystem.CopyDirectory(Klass.Source, Klass.HDD1temp)
    16. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Können schon, schrieb ich doch. Das ist bei Nebenläufigkeit immer der Fall
    Mit Control.BeginInvoke, idR mittels eines Delegaten. Aber dazu wurde hier auch schon wirklich viel geschrieben.
    Sowohl vom @ErfinderDesRades als auch von @RodFromGermany findest du hier so ziemlich alles lesenswerte darüber.
    Ansonsten hilft dieser Abschnitt, überlese bitte den Teil mit dem BackgroundWorker, ich hasse docs.microsoft.com manchmal wirklich....

    VB.NET-Quellcode

    1. Private Async Sub Methode1()
    2. Await Threading.Tasks.Task.Run(Sub()
    3. zippen()
    4. kopieren()
    5. End Sub)
    6. End Sub
    7. Private Sub zippen()
    8. IO.Directory.CreateDirectory(Klass.HDD2temp)
    9. ZipFile.CreateFromDirectory(Klass.Source, Klass.HDD2temp & ".zip", CompressionLevel.Optimal, False)
    10. End Sub
    11. Private Sub kopieren()
    12. My.Computer.FileSystem.CopyDirectory(Klass.Source, Klass.HDD1temp)
    13. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed & @Dksksm

    Habe mir nun mal eine Testumgebung zusammengestellt.
    kopieren und zippen starten NICHT IMMER gleichzeitig. Manchmal startet der zweite erst wenn der erste fertig ist.
    Der Rest funktioniert so wie ich mir das vorstellte.

    VB.NET-Quellcode

    1. Private Async Sub Threadsstarten()
    2. Timer1.Start()
    3. tb_name.Enabled = False
    4. btn_copy.Visible = False
    5. PictureBox1.Visible = True
    6. Try
    7. Await Threading.Tasks.Task.Run(Sub()
    8. kopieren()
    9. zippen()
    10. End Sub)
    11. Catch ex As Exception
    12. Timer1.Stop()
    13. tb_name.Enabled = True
    14. tb_name.Focus()
    15. btn_copy.Visible = True
    16. PictureBox1.Visible = False
    17. End Try
    18. End Sub


    Mache ich das hingegen so: Habe ich nach etlichen durchläufen den Eindruck das beide gleichzeitig starten.

    VB.NET-Quellcode

    1. ​Private Async Sub Threadsstarten()
    2. Dim zippe As Threading.Thread = New Threading.Thread(AddressOf zippen)
    3. Dim kopie As Threading.Thread = New Threading.Thread(AddressOf kopieren)
    4. Await Threading.Tasks.Task.Run(Sub() Methode2)
    5. End Sub
    6. Private Sub Methode2
    7. zippe.Start()
    8. kopie.Start()
    9. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ja sicher startet das gleichzeitig. Jeder Thread arbeitet parallel zu anderen. Mit meinem Code wird nacheinander abgearbeitet. Erst zippen, dann kopieren.
    btw: Welchen Zweck erfüllt der Timer?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann habe ich das falsch verstanden. Es sollen ja beide gleichzeitig laufen.

    Ach der Timer startet nur einen Zähler. Dient mir hier nur um bestimmte Sachen nach vollziehen zu können. Hat nichts mit dem eigentlichem Programm zu tun.
    Hier eben Starten vor den Threads ===> läuft weiter während die Threads abgearbeitet werden ===> und wird beendet wenn Threads fertig sind.
    Ich muss mir so einiges immer richtig vor Augen führen. :)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ach Moment. Du willst, dass es gleichzeitig läuft? Dann geht das auch so:

    VB.NET-Quellcode

    1. Private Sub Methode1()
    2. zippeAsync()
    3. kopiereAsync()
    4. End Sub
    5. Private Async Sub zippeAsync() 'die Async-Zusätze an den Methodennamen sind nur Konvention
    6. Await Threading.Tasks.Task.Run(Sub() zippen())
    7. End Sub
    8. Private Async Sub kopiereAsync() 'die Async-Zusätze an den Methodennamen sind nur Konvention
    9. Await Threading.Tasks.Task.Run(Sub() kopieren())
    10. End Sub

    In Methode1 wird also zippeAsync aufgerufen, dort wird zippen gestartet und sofort danach wieder zu Methode1 zurückgekehrt (entspr. Erklärung in Post#9). Dann wird gleich kopiereAsync aufgerufen, dort wird kopieren gestartet und ebenfalls zurückgekehrt. Also werden zippen und kopieren nahezu gleichzeitig parallel gestartet und nebeneinander ausgeführt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Ja das war meine Idee / Vorstellung aus Post #10
    Nur das mit den async im Sub war mir nicht klar.

    Werde nun noch bissel üben / lesen / testen ;)
    Schönen abend.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: