|
|
Publicēts 2022-3-17 11:21:50
|
|
|
|

Uzdevumu vai uzdevumu klašu izmantošanai ir veiktspējas vājā vieta, ko mēs nepieminējām iepriekšējos rakstos. Īsāk sakot, šīs klases vada, kad rezultāti ir nekavējoties pieejamiNevajadzīga piešķiršana。 Tas nozīmē, ka vienmēr tiks izveidots jauns uzdevums vai uzdevuma objekts, pat ja rezultāts jau ir pieejams. Tagad mēs minējām, ka asinhronā / gaidīšanas koncepcija, ko izmantojām iepriekšējos rakstos, ir bijusi kopš .NET 4.5 izlaišanas. Šis līdzeklis ir uzlabots kopš C# 7 ar .NET 4.7 versiju ar ValueTask struktūru, ko var izmantot kā atgriešanos asinhronām funkcijām.
ValueTask struktūra
ValueTask struktūra pirmo reizi parādījās corefxlab repozitorijā, 2015. gadā. Šis repozitorijs tiek izmantots, lai eksperimentētu un izpētītu jaunas idejas, kas var nonākt galvenajā corefx repozitorijā. Corefx repozitorijs ir repozitorijs, kurā atrodas visas .NET Core bāzes bibliotēkas. To izstrādāja un ieteica Stīvens Taubs System.Threading.Tasks.Channels bibliotēkai. Tajā laikā Stefans sniedza īsu paskaidrojumu:
CorefxLab bibliotēkas adrese:Hipersaites pieteikšanās ir redzama.
ValueTask ir atšķirīga T un Task savienība, kas ļauj ReadAsync brīvi piešķirt, lai sinhroni atgrieztu pieejamās T vērtības (atšķirībā no Task.FromResult izmantošanas, kas prasa uzdevuma instances piešķiršanu). ValueTask ir gaidāms, tāpēc vairuma gadījumu patēriņš nav atšķirams no uzdevumu patēriņa. Daudzi cilvēki redz šīs struktūras izmantošanas priekšrocības, kas ir iekļautas C# 7 kā daļa no System.Threading.Tasks.Extensions NuGet pakotnes. Tātad, pirms mēs ienirsim ValueTask struktūrā, apskatīsim problēmu, ko tā izmanto, lai atrisinātu. Tā kā Task(Task) ir atsauces tips, sāciet arAsinhronā metode, kas atgriež uzdevuma objektu, nozīmē, ka tas katru reizi tiek piešķirts kaudzē。 Tas ir nepieciešams daudzos gadījumos.
Tomēr dažos gadījumos asinhronās metodes atgriež rezultātus nekavējoties vai pabeidz sinhroni. Šādos gadījumos šis sadalījums nav vajadzīgs un var kļūt dārgs veiktspējai kritiskajās koda daļās. Līdz .NET 4.7 izlaidumam nebija iespējams no tā izvairīties, jo asinhronajām metodēm bija jāatgriež uzdevums, uzdevums <T>vai anulēšana (pēdējais parasti bija nevēlams). Šajā .NET versijā tas ir paplašināts, kas nozīmē, ka asinhronā metode var atgriezt jebkuru tipu, ja vien tai ir pieejama GetAwaiter metode. ValueTask ir konkrēts šāda veida piemērs, un tas tika pievienots arī šim laidienam.
Jūs varat pārlūkot corefx repozitoriju un redzēt pilnu ValueTask ieviešanu, šeit ir API sadaļa, kas mūs interesē:
Kā struktūra ValueTask ļauj rakstīt asinhronas metodes, kas sinhronā izpildlaikā nepiešķir atmiņu. Šādā veidā netiek apdraudēta asinhronās / gaidīšanas koncepcijas API konsekvence. Papildus tam šī struktūra gaida pati, padarot to viegli lietojamu. Piemēram, ja mēs palaižam šo vienkāršo kodu:
MultiplyAsync metodē mēs simulējam situāciju, kad mēs vēlamies izvairīties no uzdevuma izmantošanas un atgriezt tikai vienkāršu veselu skaitli. Tas tiek darīts metodes if paziņojumā, kur mēs būtībā pārbaudām, vai nodotais parametrs ir nulle. Problēma irPat ja mūsu nosacījums priekšrakstā if ir patiess, iepriekš minētais kods izveido uzdevuma objektu。 Mēs atrisinām šo problēmu šādi:
ValueUzdevums un uzdevums
Kā minēts iepriekš, ValueTask izmantošanai ir divas galvenās priekšrocības:
- Veiktspējas uzlabojumi
- Palielināt īstenošanas elastību
Tātad, kādi ir veiktspējas uzlabojumu skaitļi? Ievērojiet šo kodu:
Ja mēs palaižam šo kodu, JIT izpildei nepieciešami 120 ns. Tagad, ja mēs aizstājam uzdevumu ar ValueTask šādi:
Izmantojot JIT, mēs iegūsim izpildes laiku 65ns. Tagad ir taisnība, ka Task.Delay dēļ mēs neizpildām sinhroni, bet mēs redzam izpildes laika uzlabošanos.
Vēl viens ieguvums, ko mēs minējām, ir lielāka elastība ieviešanā. Ko tas īsti nozīmē? Nu, sinhronizējamo asinhrono interfeisu ieviešana būs spiesta izmantot Task.Run vai Task.FromResult. Protams, tas noved pie veiktspējas problēmām, kuras mēs apspriedām iepriekš. Izmantojot ValueTask, mēs, visticamāk, izvēlēsimies sinhronu vai asinhronu ieviešanu. Ņemiet vērā, ka tas var liecināt par to, ka jūsu kods var nebūt labi izstrādāts, ja tas notiek ar jums.
Piemēram, ievērojiet šo saskarni:
Pieņemsim, ka vēlaties to izsaukt no šāda koda:
Tā kā saskarnē mēs izmantojam ValueTask, saskarnes ieviešana var būt sinhrona vai asinhrona. Mēs varam iegūt šo labumu, būtībā izlaižot dažu funkciju pievienošanu IThing, kas apstrādā sinhronizācijas uzvedību. Šādā veidā ir daudz vieglāk izmantot šo saskarni. Šeit ir iepriekš minētās saskarnes sinhrona ieviešana:
Šeit ir asinhrona tā paša interfeisa ieviešana:
Tomēr pirms ValueTask izmantošanas mums ir jāapsver daži kompromisi. Ir viegli domāt, ka ValueTask ir jāizmanto pēc noklusējuma, nevis Task, kas noteikti tā nav. Piemēram, lai gan ValueTask palīdz izvairīties no nevajadzīgām piešķiršanām, kad ir pieejama rezultātu sinhronizācija, tajā ir arī divi lauki.
Ir svarīgi atcerēties, ka šī ir struktūra, ko mēs šeit izmantojam, kas nozīmē, ka mēs izmantojam vērtību veidus un visus to slogus. Savukārt uzdevums ir atsauces tips ar tikai vienu lauku.Kad izmantojat ValueTask, mums ir vairāk datu, kas jāapstrādā un jāapstrādā. Ja šāda metode tiek gaidīta asinhronā metodē, tad asinhronā metode irArī valsts mašīna būs lielāka, jo visas struktūras glabāšanai parasti ir nepieciešams vairāk vietas nekā vienas atsauces glabāšanai.
Tāpēc Microsoft cilvēki faktiski iesaka izmantot uzdevumu vai uzdevumu kā noklusējuma atgriešanās veidu asinhronajām metodēm. Tikai pēc veiktspējas analīzes vajadzētu apsvērt pāreju uz ValueTask.
Kopsavilkuma
ValueTask ir struktūra, kas ieviesta .NET 4.7, kas dod mums daudz iespēju izmantot asinhronās metodes .NET. Tomēr tas nav bez cenas. Tas ir noderīgi veiktspējai kritiskām metodēm, kas tiek izpildītas sinhroni. Ar viņiem mēs varam izvairīties no nevajadzīgu objektu piešķiršanas. Tomēr kā vērtību tips tam ir visas problēmas, kas parasti ir vērtību tipiem. Tāpēc mēs varam gūt labumu no šīs struktūras, bet mums jābūt uzmanīgiem.
Sākotnējā adrese:Hipersaites pieteikšanās ir redzama.
|
Iepriekšējo:【Praktiska darbība】 Izmantojiet Docker, lai izveidotu IPsec VPN serveriNākamo:Izmantojiet OpenConnect, nevis Cisco AnyConnect, lai izvairītos no tabulas bloķēšanas maršrutēšanas
|