Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 42759|Antwort: 5

[Quelle] Warum ist .net/c# Task langsamer als Thread?

[Link kopieren]
Veröffentlicht am 03.05.2017 16:40:28 | | | |
.NET 4 enthält einen neuen Namensraum, System.Threading.Tasks, der Klassen enthält, die die Threading-Funktionalität abstrahieren. Nutze ThreadPool im Hintergrund. Eine Aufgabe stellt die Arbeit einer Einheit dar, die erledigt werden sollte. Die Arbeit dieser Einheit kann in einem separaten Thread ausgeführt werden oder eine Aufgabe kann synchron gestartet werden, was das Warten auf den Haupt-Tuning-Thread erfordert. Die Nutzung von Aufgaben gibt dir nicht nur eine Abstraktionsschicht, sondern auch viel Kontrolle über die zugrundeliegenden Threads.
Aufgaben bieten viel Flexibilität, wenn es darum geht, die zu erledigen Arbeit zu planen. Zum Beispiel können Sie eine kontinuierliche Aufgabe definieren – welche Arbeit nach Abschluss einer Aufgabe erledigt werden sollte. Das kann den Unterschied zwischen einem erfolgreichen und nicht-erfolgreichen Projekt ausmachen. Außerdem können Aufgaben in einer Hierarchie angeordnet werden. Zum Beispiel kann eine Elternaufgabe eine neue Kindaufgabe erstellen. Dies erzeugt eine Abhängigkeit, sodass, wenn du die Eltern-Aufgabe abbrichst, auch deren Kind-Aufgabe abgebrochen wird.


Heutzutage ist es üblich, Aufgabenausführungsmethoden zu verwenden, und sie sind leistungsstark, und ich weiß nicht, wo die Aufgabenleistung liegt.

Ich habe Task und Thread selbst getestet und habe das Gefühl, dass Task sehr langsam ist, was die Performance stark beeinträchtigt, und der Testcode ist wie folgt:

Wir schleifen die Methode 1000 Mal durch, dann blockiert die Methode für 100 Millisekunden, und das Testergebnis ist wie folgt:



Ergebnis:
Die Ausführung des Threads dauert 188 Millisekunden
Die Ausführung der Aufgabe dauert 14.671 Millisekunden


Der Geschwindigkeitsunterschied zwischen beiden beträgt das 78-fache!!

Die Aufgabe ist sehr langsam, ich weiß nicht, warum das passiert, stimmt etwas mit meinem Testcode nicht oder was? Ich hoffe, Sie können erklären, warum das passiert...




Vorhergehend:Nachrichten mit ASP.NET Core senden
Nächster:C# Parallel-Berechnung Parallel.For&Parallel.For
 Vermieter| Veröffentlicht am 13.10.2020 10:47:17 |
tongli1996218 Veröffentlicht am 13.10.2020 09:34
Um denselben Code wie Thread zu gewährleisten, ist meine Operation folgender Code, und der obige ist Pseudocode
PS: Ruf einfach await Task.Delay auf, ohne ... hinzuzufügen

Ja, danke

Aufgabenausführungszeit: 117,0357

Du kannst den Code wie folgt ändern:

Task.Run ersetzt Task.Factory.StartNew, weil es interne Aufgaben automatisch auspackt.
Task.WaitAll wartet auf eine externe Aufgabe statt auf eine interne. Die Verwendung von Task.Run hat keine verschachtelten Aufgaben.


Wenn man sich die msdn-Dokumentation ansieht, sieht man, dass die Methode Task.Delay Method eine Aufgabe erstellt, die nach einer festgelegten Anzahl von Millisekunden abgeschlossen wird. (Tatsächlich wird ein neuer Thread erstellt, der auf die Ausführung der Aufgabe gewartet wird, ich weiß nicht, ob ich das richtig verstehe.)

Der Hyperlink-Login ist sichtbar.

Außerdem gibt es einen Unterschied zwischen Task und Void

Task gibt eine asynchrone Methode zurück, die warten kann
Die Void Return asynchrone Methode kann nicht warten, sie funktioniert asynchron, man kann nicht wissen, wann sie fertig ist, man kann den Status dieser asynchronen Operation nicht überwachen.


Referenz:

Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.

Zusammengefasst: Es gibt ein Problem mit dem Code, ich sollte Thread.Sleep nicht innerhalb der Task-Methode verwenden
Veröffentlicht am 21.07.2020 13:09:29 |
Ich hatte heute dasselbe Problem, ich benutze Multithreading für AES-Verschlüsselung, Task ist viel langsamer als Thread!!
Hat der Vermieter den Grund gefunden?
Veröffentlicht am 12.10.2020 19:24:48 |
Dieser Beitrag wurde zuletzt von tongli1996218 am 12.10.2020 um 19:43 bearbeitet

Nachdem ich den Code des Besitzers getestet habe, verringert sich die Zeit der Aufgabe weiter, wenn das Programm mehrfach gestartet und ausgeführt wird, und auf meinem Computer wird sie auf weniger als Thread reduziert, während Thread innerhalb dieser Zeit stabil ist.

Später stellte sich heraus, dass die Thread.Sleep(100)-Methode negative Auswirkungen auf Task hatte, aber nicht auf Thread, und Thread.Sleep(100) konnte durch andere zeitaufwändige Programmverifizierungen wie numerische Selbstaddition oder warten auf Task.Delay(100) ersetzt werden.

PS: Thread.Sleep beendet die aktuelle Thread-Slicing-Zeit nach dem Aufruf, zum Beispiel beendet Thread.Sleep(0) die aktuelle Thread-Slicing-Zeit und überträgt sie an andere Threads, um sie auszuführen. Im Inneren der Aufgabe befindet sich ein Thread-Pool, der den Kontextwechsel von Threads optimieren und die CPU-Verlustzeit reduzieren kann (insbesondere bei der Mehrkern-CPU-Optimierung), während Thread.Sleep(100) die Schaltlogik des ursprünglichen Thread-Pools der Aufgabe stört, was zu viel CPU-Zeitverlust führt

Wenn Sie Thread.Sleep(100) durch await Task.Delay(100) ersetzen, werden Sie feststellen, dass der Zeitaufwand der Aufgabe nur mehr als 100 Millisekunden beträgt, wie unten gezeigt:
private void TaskTest()
{
        Thread.Sleep (100);
         ... Führe die Aktion aus
}
Ersetzt durch
private async void TaskTest()
{
      warten auf Aufgabe.Verzögerung(100);
      ... Die Ausführung dauert mehr als 100 Millisekunden für die Aufgabe, was dem ursprünglichen Thread.Sleep(100) für Thread entspricht
}




 Vermieter| Veröffentlicht am 12.10.2020 22:53:05 |
tongli1996218 Veröffentlicht am 12.10.2020 19:24
Nachdem der Code des Besitzers getestet wurde, verringert sich beim Start des Programms die Zeit der Aufgabe nach mehrfachem Ausführen weiter, und auf meinem Computer wird sie auf weniger als bei Thread reduziert...

Ich habe versucht, ihn so zu ändern:
Aufgabe.Verzögerung(100000);

Aufgabenausführungszeit:14,1306 ms, die Gesamtzeit ist tatsächlich sehr kurz, jedoch stellte ich fest, dass die von Task aufgerufene Methode die Ausführung nicht abgeschlossen hat.
Veröffentlicht am 13.10.2020 09:34:33 |
Dieser Beitrag wurde zuletzt von tongli1996218 am 13.10.2020 09:40 bearbeitet
Veröffentlicht am 12.10.2020, 22:53 Uhr
Ich habe versucht, ihn so zu ändern:
Aufgabe.Verzögerung(100000);

Um denselben Code wie Thread zu gewährleisten, ist meine Operation folgender Code, und der obige ist Pseudocode
PS: Ruf einfach await Task.Delay auf und füge dann keinen Code hinzu, der von der Aufgabe geöffnete Thread wird sofort zurückgegeben, um die Simulation des Compute-Bounds sicherzustellen, kannst du verwenden für (int a = 0; a< 1000000; ++a){}; Solche Methoden stattdessen

private asynchrone statische void TaskTest()
        {
            warten auf Task.Delay(100000);
             Interlocked.Increment (Ref Run);    Sperren, aber der Deckkopf ist kleiner
            wenn(lauf == j)
             {
                Stoppuhr. Stop(); Überwachung stoppen
                Zeitspann = Stoppuhr. Verstrichen;  Erhält die Gesamtzeit, die von der aktuellen Instanz gemessen wird.
                Console.WriteLine("Task-Ausführungszeit:" + Zeitspanne. TotalMillisekunden); Gesamtmillisekunden
              }
        Auch die benötigte Zeit ist sehr kurz


Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com