C# ja miljardin rivin haaste, osa 8
Edellisessä blogikirjoituksessa käsittelin viidennen optimoidun version toteutusta. Tässä viimeisessä osassa olisi tarkoitus testata AOT:n tuomia suorituskykyhyötyjä Linux-ympäristössä.
Native AOT eli suoraan ajettava binääri
.NET:in Native AOT (ahead-of-time) -tuki tuli mukaan .NET 8 -versiossa. Käytännössä se siis tarkoittaa sitä, että ohjelman voi kääntää tavalliseksi binääriksi, jonka voi ajaa ilman erillistä .NET-ympäristöä. Tämä on erityisen kätevää varsinkin Docker-ympäristöissä, joissa halutaan mahdollisimman pieni image (levykuva).
Aivan kaikkea .NET-koodia ei kuitenkaan saa käännettyä AOT-yhteensopivaksi, joten oman ohjelman mahdolliset AOT-ongelmakohdat kannattaa tarkistaa huolella.
Muutokset
Aiempaan Optimoitu 5 -versioon verrattuna tein kaksi pientä muutosta. Ensimmäinen oli projektin siirtäminen .NET 10 -malliseksi, joka onnistuu helposti vaihtamalla optimoitu_5.csproj-tiedostossa rivin
<TargetFramework>net9.0</TargetFramework>
muotoon
<TargetFramework>net10.0</TargetFramework>
lisäksi käänsin koodista AOT-version seuraavalla komennolla:
dotnet publish /p:PublishAot=true
ja lopputuloksena oli 2,1 megatavun kokoinen binääritiedosto.
(varsinainen binääri päätyi tässä tapauksessa bin/Release/net10.0/linux-x64/publish-kansioon)
Parannus
Tällä kertaa mukana ei ole vertailua aiempiin versioihin, koska ajoin testit erittäin edullisella Linux VPS -koneella, joten tulokset eivät ole vertailukelpoisia aiempien testitulosten kanssa. AOT:n tuoma suorituskykyero on kuitenkin erittäin huomattava tälläisen järjestelmän kanssa, jossa kaikkia resursseja on rajoitettu.
| Syöte | Optimoitu 5 (.NET 10) | Optimoitu 5 (.NET 10) AOT |
|---|---|---|
| 100 miljoonaa riviä | 38,4 sekuntia | 25,8 sekuntia |
🐧