mbravenboer schreef op 04 september 2002 @ 09:42:
[...]
Ik hoorde op de Mono mailing list een keer flinke kritiek op de aanpak van optimalisatie in ngen versus de optimalisatie in de jitter. Ze schijnen beide dezelfde optimizer te gebruiken. Gezien de volledig verschillende behoeften at runtime werd dit als onverstandig afgeschilderd, wat op zich niet bepaald verbazingwekkend is. Je zou sowieso verschillende niveaus van optimalisatie verwachten. Kan ik uit jouw woorden opmaken dat ze het nu dus wellicht gaan splitsen?
Dat idee had ik wel ja. Er is een artikel over verschenen op de MSDN site tijdje geleden. ngen.exe is nu in zn 1e versie en ze hebben geprobeerd daar een wat werkbare versie van te maken, maar de grote sprong voorwaards moet nog komen. Vooral het gemis van een JIT at runtime is merkbaar bij veel apps die zijn ge'ngen't.
Wat vooral verbazing oogste was de beperkte optimalisaties in de JIT op dit moment, en vooral het gebrekkige voorwerk dat wordt verricht door de compilers (en bv ook door ngen die perfect langdurige optimalisatie analyses kan doen zodat de JIT sneller beslissingen kan nemen wat tijd scheelt). Ook hier willen ze veel verbeteringen aanbrengen, ze hebben het nu allemaal wat conservatief gehouden, een aanpak die ik wel begrijp. Een JIT moet nu eenmaal niet te lang doen over een optimalisatie en de threshold die je kiest wanneer wel en wanneer niet een optimalisatie wordt uitgevoerd is bepalend voor de snelheid waarmee alles draait, die wat conservatief stellen scheelt je wellicht top performance in sommige gebieden maar vermijdt ook trage performance in wellicht veel gebieden.
Ik ben trouwens een beetje verbaasd over je stukje over het (niet) nut van het cachen van native gecompileerde code. Ik dacht juist begrepen te hebben dat deze mogelijkheid als een van de sterke punten werd gepresenteerd? Volledige just in time compilatie zoals in .NET zorgt nogal voor een opstartprobleem, wat er ook al is in de JVM. Vandaar dat daar gekozen is voor mixed-mode executie en bij het opstarten begint de JVM dus met interpreteren. Door native gecompileerde code voor assemblies te cachen, kan je deze opstarttijd problemen toch voorkomen lijkt mij? Het nut van deze aanpak is ook vaak besproken voor de JVM, maar ik heb nooit echt duidelijke argumenten voor of tegen gehoord.
Dit dacht ik ook, dat ze dus alle native code cachten. Dit is echter niet het geval. ngen cachet dus native code maar JIT niet, de JIT runt de code maar cachet niet. Een uitzondering zijn de ASP.NET pages / classes, die wel pre-compiled gecached worden. Een reden hiervoor is denk ik dat deze niet echt in aanmerkingkomen voor JITting, maar het compilatieprocess wel lang kan duren. (mn dual p3-933 doos met 512MB ram en serverworks chipset heeft af en toe soms wel 3 seconden nodig voor het compileren van de 1e page

)
Als je ziet wat voor optimalisaties de csc compiler bv uitvoert, dan is dat echt helemaal niks. De JIT voert op dit moment ook maar weinig echte diepe optimalisaties uit, meer het rechtbreien van crappy code. Als je dat dus al niet gebruikt, dan is het optimaliseren dus in feite niet echt ver doorgevoerd op dit moment, maar er is ruimte voor verbeteringen.
vziw zijn alle .NET libs van MS wel met ngen gecompileerd, die JIT je dus niet mee. Of dit een goed ding is weet ik eerlijk gezegd niet, maar ze zullen dit ongetwijfeld getest hebben