Wij zijn bezig met het maken van een server-applicatie die verantwoordelijk is voor messaging.
De applicatie moet berichten encrypten, compressen, signen etc... Er wordt veelvuldig gebruik gemaakt van Streams. Dit kunnen FileStreams, MemoryStreams, etc... zijn.
Initieel dachten we dat we best zoveel mogelijk gebruik moesten maken van async methods (CopyToAsync, ReadAsync, WriteAsync, etc...) indien we operaties uitvoeren op een Stream. Op die manier zou onze applicatie beter moeten functioneren onder heavy load.
Na wat onderzoek echter blijkt dat Async operaties veel trager zijn dan ik initieel dacht. Ik wist dat er een overhead was, maar het kopieëren van een FileStream naar een andere FileStream gaat via CopyToAsync een factor 5 tot 6x trager dan een reguliere CopyTo. (Blijkt wel dat ik dit kan versnellen door eerst de Length van de target-stream te zetten, maar dat kan ik niet altijd doen: bij het encrypten en compressen bv weet ik niet wat de uiteindelijke size van de target-stream zal zijn).
Nu lees ik ook dat MemoryStream bv geen echte async operaties ondersteunt. De operatie wordt gewoon synchroon uitgevoerd; dit voegt dus niet meer toe dan wat additionele overhead en zal imo dus ook niet bijdragen tot het beter functioneren van de applicatie onder heavy load.
Is het dus nuttig om in dit geval gebruik te maken van de async methods die binnen het .NET framework beschikbaar zijn ? Kan ik niet beter gewoon overal de synchrone varianten gaan gebruiken ?
De applicatie moet berichten encrypten, compressen, signen etc... Er wordt veelvuldig gebruik gemaakt van Streams. Dit kunnen FileStreams, MemoryStreams, etc... zijn.
Initieel dachten we dat we best zoveel mogelijk gebruik moesten maken van async methods (CopyToAsync, ReadAsync, WriteAsync, etc...) indien we operaties uitvoeren op een Stream. Op die manier zou onze applicatie beter moeten functioneren onder heavy load.
Na wat onderzoek echter blijkt dat Async operaties veel trager zijn dan ik initieel dacht. Ik wist dat er een overhead was, maar het kopieëren van een FileStream naar een andere FileStream gaat via CopyToAsync een factor 5 tot 6x trager dan een reguliere CopyTo. (Blijkt wel dat ik dit kan versnellen door eerst de Length van de target-stream te zetten, maar dat kan ik niet altijd doen: bij het encrypten en compressen bv weet ik niet wat de uiteindelijke size van de target-stream zal zijn).
Nu lees ik ook dat MemoryStream bv geen echte async operaties ondersteunt. De operatie wordt gewoon synchroon uitgevoerd; dit voegt dus niet meer toe dan wat additionele overhead en zal imo dus ook niet bijdragen tot het beter functioneren van de applicatie onder heavy load.
Is het dus nuttig om in dit geval gebruik te maken van de async methods die binnen het .NET framework beschikbaar zijn ? Kan ik niet beter gewoon overal de synchrone varianten gaan gebruiken ?
https://fgheysels.github.io/