Iteam
GitHub

Asynkron programmering del 1

Man kan ju fråga sig varför en server skriven i Javascript kan bli snabbare än en som är kompilerad i C#. Oavsett vilket språk mananvänder så behöver man vid vissa tillfällen hämta saker från disk, databas eller från nätverk. Eftersom Node.JS är enkeltrådat MÅSTE man skriva all kod asynkron för att inte hela servern ska hänga sig vilket inte är fallet i C#.

Detta enkla faktum gör att man oftast skriver synkron kod i C# och därför ligger större delen av koden i väntan på olika I/O anrop. Hela sidan beräknas seriellt och varje fördröjning i I/O gör applikationen långsam. Jämför med att överföra små och stora filer med FTP – om du har flera parallella överföringar igång kan alla små anrop bli klara samtidigt som de stora filerna överförs. På samma sätt vill man hinna göra klart så mycket som möjligt av resterande kod under tiden man väntar på svaren från alla sina I/O anrop.

Eftersom många redan är vana vid detta i Javascript, mycket på grund av AJAX och Jquery, har man en inbyggd känsla för hur asynkron programmering ska byggas i Javascript vilket gör dem snabbare än sajter byggda i C#.

Nu betyder detta inte att Node.JS alltid är bättre än C# eller att man inte kan använda sig av asynkrona programmeringsmönster även i C# eller i Java. Däremot har det krävt ganska komplicerad kod tidigare. I nästa version av Visual Studio 2012 finns Microsoft Async vilket innebär stora förbättringar i hur asynkront programmeringsmönster kan hanteras.

Kodexempel

Motsvarande kod i Javascript skulle vara:

För att lära sig mer om Async i C# finns det en jättebra sida med exempel:

http://www.wischik.com/lu/AsyncSilverlight/AsyncSamples.html

Om du inte gjort det redan borde du ladda ner Node.JS och installera Express som ger en bra start för att börja bygga sajter med Node.JS:

npm install Express

En annan viktig skillnad mellan Node.JS och ASP.NET är hur mycket resurser som går åt för varje anrop. I C# används som standard en tråd per request. Det innebär att mycket tid går åt till att frigöra resurser från trådpoolen till varje request, dessutom tar varje tråd minst två megabyte minne vilket gör att tusentals samtidiga requests kräver enorma mängder ram på servern. I Node.JS finns inga trådar utan allt körs inom samma process vilket gör att anrop som väntar på svar inte tar mer än några kilobyte i minne.

Christian Landgren
2012-06-08