See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 42759|Vastuse: 5

[Allikas] Miks on .net/c# ülesanne aeglasem kui Thread?

[Kopeeri link]
Postitatud 03.05.2017 16:40:28 | | | |
.NET 4 sisaldab uut nimeruumi, System.Threading.Tasks, mis sisaldab klasse, mis abstrakteerivad lõimimise funktsionaalsust. Kasuta taustal ThreadPooli. Ülesanne tähistab üksuse tööd, mis tuleks lõpetada. Selle seadme tööd saab käivitada eraldi lõimes või käivitada ülesanne sünkroonselt, mis nõuab peamise häälestuslõime ootamist. Ülesannete kasutamine annab sulle mitte ainult abstraktsioonikihi, vaid ka palju kontrolli aluseks olevate lõimede üle.
Ülesanded pakuvad palju paindlikkust tööde ajastamisel. Näiteks saate defineerida pideva ülesande – millist tööd tuleks pärast ülesande lõpetamist teha. See võib otsustada, kas ülesanne on edukas või mitte. Lisaks saab ülesandeid korraldada hierarhias. Näiteks võib vanemülesanne luua uue alamülesande. See tekitab sõltuvuse, nii et kui tühistad vanema ülesande, tühistatakse ka selle lapsülesanne.


Tänapäeval on populaarne kasutada ülesannete täitmise meetodeid, mis on kõrge jõudlusega ja ma ei tea, kus ülesannete sooritus on.

Testisin ise Taski ja Threadi ning tunnen, et Task on väga aeglane, mis mõjutab jõudlust tugevalt, ning testikood on järgmine:

Me läbime meetodi 1000 korda, seejärel blokeerime meetodi 100 millisekundiks ning testitulemus on järgmine:



Tulemus:
Lõime täitmine võtab 188 millisekundit
Ülesande täitmine võtab aega 14 671 millisekundit


Nende kahe kiiruse on 78 korda!!

Ülesanne on väga aeglane, ei tea, miks see juhtub, kas mu testikoodiga on midagi valesti või mis? Loodan, et suudad selgitada, miks see juhtub...




Eelmine:Saada sõnumeid ASP.NET Core'iga
Järgmine:C# Paralleelne arvutus paralleel.for&paralleel.for jaoks
 Üürileandja| Postitatud 13.10.2020 10:47:17 |
tongli1996218 Postitatud 2020-10-13 09:34
Selleks, et tagada sama kood nagu Threadil, on minu tegevus järgmine kood ja ülaltoodud on pseudokood
PS: Lihtsalt helista ja oota Task.Delay ilma lisamata ...

Jah, aitäh

Ülesande täitmise aeg: 117.0357

Koodi saab muuta järgmiselt:

Task.Run asendab Task.Factory.StartNew faili, sest see avab automaatselt sisemised ülesanded.
Task.WaitAll ootab välist ülesannet, mitte sisemist. Task.Run'i kasutamine ei sisalda pesastatud ülesandeid.


Vaadates msdn dokumentatsiooni, näed, et Task.Delay meetod loob ülesande, mis lõpetatakse kindla millisekundite arvu järel. (Tegelikult luuakse uus lõim ja lisatakse ootamine, et oodata ülesande täitmist, ma ei tea, kas saan õigesti aru)

Hüperlingi sisselogimine on nähtav.

Lisaks on ülesannete ja tühjuse vahel

Ülesanne tagastab asünkroonse meetodi, mis võib oodata
Void return asünkroonne meetod ei saa oodata, see töötab asünkroonselt, sa ei saa teada, millal see tehtud on, sa ei saa jälgida selle asünkroonse operatsiooni olekut.


Viide:

Hüperlingi sisselogimine on nähtav.
Hüperlingi sisselogimine on nähtav.

Kokkuvõttes: koodiga on probleem, ma ei tohiks Thread.Sleepi kasutada Task-meetodis
Postitatud 21.07.2020 13:09:29 |
Mul oli täna sama probleem, kasutades mitmelõimelist AES-krüpteerimist, Task on palju aeglasem kui Thread!!
Kas üürileandja on põhjuse leidnud?
Postitatud 12.10.2020 19:24:48 |
Seda postitust toimetas viimati tongli1996218 2020-10-12 kell 19:43

Pärast omaniku koodi testimist, kui programm käivitatakse ja käivitatakse mitu korda, jätkab ülesande kestus vähenemist ning minu arvutis väheneb see vähem kui Thread ja Thread on selle aja jooksul stabiilne.

Hiljem selgus, et Thread.Sleep(100) meetod avaldas Taskile negatiivset mõju, kuid mitte Threadi, ning Thread.Sleep(100) võis asendada muu ajamahuka programmikontrolliga, nagu numbriline iseliitmine või ootamine Task.Delay(100).

PS: Thread.Sleep lõpetab praeguse lõime lõime aja pärast kutsumist, näiteks Thread.Sleep(0) lõpetab praeguse lõime lõime aja ja kannab selle teistele lõimedele käivitamiseks. Ülesande sees on lõimebassein, mis optimeerib lõimede kontekstivahetust ja vähendab protsessori kadu aega (eriti mitmetuumalise CPU optimeerimisel), samas kui Thread.Sleep(100) häirib algse lõimepooli lülitusloogikat, põhjustades palju CPU ajakadu

Kui asendada Thread.Sleep(100) await Task.Delay(100)-ga, siis avastad, et ülesande ajakulu on üle 100 millisekundi, nagu allpool näidatud:
privaatne void TaskTest()
{
        Thread.Sleep(100);
         ... Teosta tegevus
}
Asendatud
private async void TaskTest()
{
      oota ülesannet. Viivitus (100);
      ... Täitmine võtab ülesande jaoks üle 100 millisekundi, mis on sama mis originaalses Thread.Sleep(100) Thread'is
}




 Üürileandja| Postitatud 12.10.2020 22:53:05 |
tongli1996218 Postitatud 2020-10-12 19:24
Pärast omaniku koodi testimist, kui programm käivitatakse, väheneb ülesande aeg pärast mitut käivitamist ja minu arvutis väheneb see vähem kui Threadis...

Proovisin muuta selle koodiks nii:
Task.Delay(100000);

Ülesannete täitmise aeg:14.1306 ms, koguaeg on tõepoolest väga lühike, kuid leidsin, et Taski poolt kutsutud meetod ei lõpetanud täitmist.
Postitatud 13.10.2020 09:34:33 |
Seda postitust toimetas viimati tongli1996218 2020-10-13 09:40
Avaldatud 2020-10-12 22:53
Proovisin muuta selle koodiks nii:
Task.Delay (100000);

Selleks, et tagada sama kood nagu Threadil, on minu tegevus järgmine kood ja ülaltoodud on pseudokood
PS: Lihtsalt kutsu await Task.Delay ja lisa koodi mitte – ülesande poolt avatud lõim tagastatakse kohe, et tagada arvutus-piiratud simulatsioon, mida saad kasutada (int a = 0; a< 1000000; ++a){}; Sellised meetodid selle asemel

privaatne asünkroonne staatiline void TaskTest()
        {
            oota ülesannet. Viivitus (100000);
             Interlocked.Increment (ref run);    lukk, aga ülemine kulu on väiksem
            if(run == j)
             {
                stopper. Stop(); Peata jälgimine
                TimeSpan ajavahemik = stopper. Möödus;  Saab praeguse eksemplari poolt mõõdetud koguaja.
                Console.WriteLine("Ülesande täitmise aeg:" + ajavahemik. TotalMilliseconds); Kokku millisekundid
              }
        Kulutatud aeg on samuti väga lühike


Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com