<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Framework</title>
        <link>http://www.ozgurbelul.com/category/7.aspx</link>
        <description>.NET Framework</description>
        <language>tr-TR</language>
        <copyright>Özgür Belül</copyright>
        <managingEditor>ozgurbelul@hotmail.com</managingEditor>
        <generator>Subtext Version 1.9.5.177</generator>
        <item>
            <title>NGen.exe – Native Code Generator</title>
            <link>http://ozgurbelul.com/archive/2008/06/28/ngen.exe--native-code-generator.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;.Net Framework ile birlikte gelen bir araç olan NGen.exe kurulum anında uygulamanın IL kodlarını makine diline çevirmeye yarıyor. Kod kurulum esnasında makine diline çevrildiği için çalışma anında JIT derleyicilerin derleme yapmasına gerek kalmadığından performans avantajı sağlanıyor.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Makine diline çevrilen kod aşağıdaki gibi bir dizine kaydediliyor. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;C:\Windows\Assembly\NativeImages_v2.0.50727_32 &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Son dizin ismindeki rakamlar CLR versiyonunu ve kodun 32bit işletim sistemi için oluşturulduğunu belirtiyor.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Peki bu kod nasıl çalışıyor? CLR bir assembly yüklediğinde NGen.exe ile oluşturulan dosyanın olup olmadığını kontrol ediyor. Eğer dosya varsa CLR bunu kullanıyor ve çalışma anında derleme işini aradan çıkartıyor dosya yoksa CLR standart prosedürü uygulayıp çalışma anında kodu makine diline çeviriyor.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Managed kod avantajlarından (Garbage collection, tip güvenliği, vs. ) yararlanıp dezavantajlarından kurtulmak (Performans kaygıları) ilk anda kulağa hoş geliyor. Ancak gerçekte işler göründüğü kadar iyi değil.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Öncelikle birçok yazılım geliştiricinin düştüğü hata sadece NGen kullanılarak çevrilmiş kodu çalıştırmanın yeterli olacağıdır. Ancak bu mümkün değil. CLR’ın çalışma anında reflection, serialization gibi işlemler için assembly’nin metadatasına erişmesi gerekiyor. Bu sebeple IL kodu da NGen tarafından çevrilmiş kodla birlikte olmalıdır. Bununla birlikte CLR aşağıdaki sebelerden dolayı ya da bir şekilde NGen tarafından çevrilmiş kodu kullanamazsa IL kodunu çalışma anında derlemektedir.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;CLR, NGen tarafından çevrilmiş kodu  yüklediğinde IL üzerinden bir takım özellikleri mevcut çalışma ortamıyla karşılaştırır. Bunlardan bazıları: İşlemci tipi, CLR versiyonu, Uygulamanın build şekli (Release, debug, optimized debug, vs.), MVID (Assembly Module Version ID), vs. Eğer bu özelliklerden herhangi birisi uyumsuz olursa CLR NGen tarafından çevrilmiş kodu çalıştırmaktan vazgeçip çalışma anında IL kodunu makine diline çeviriyor. Burada şunu da belirtmekte fayda var NGen.exe update modunda çalıştırabilirsiniz böylelikle son kullanıcı framework’ün yeni bir service pack’ini kurduğunda service pack kurulum programı otomatik olarak NGen.exe’yi çalıştırabilir ve dosyaların bilgisayarda yüklü son CLR versiyonu ile uyumluluğu sağlanmış olur.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Diğer bir nokta ise assembly dosyaları standart Windows PE (Portable Executable) dosyalarıdır ve belirlenmiş bellek adreslemelerine sahiptirler. Windows NGen tarafından çevrilmiş kodu çalıştırdığında bellek adreslemesi yapılan alanları kullanıp kullanamadığına bakar. Eğer bir sebepten dolayı belirlenmiş adresleri kullanamıyorsa Windows uygulamadaki bellek adreslemesini yeniden yapılandırır. Bu oldukça zaman tüketen bir durumdur çünkü öncelikle tüm uygulama belleğe alınır ve burada düzeltmeler yapılır. Bununla birlikte değiştirilen tüm dosyalar içinde bir yedekleme dosyası oluşturulur ki bu da bir başka maliyettir. Diğer bir araç olan CSC.exe’nin (C Sharp Compiler) &lt;strong&gt;/baseaddress&lt;/strong&gt; komutunu kullanarak iyi bir bellek adreslemesi yapma şansına sahip olabilirsiniz. Şans diyorum çünkü malesef Microsoft bu konuda pek yardımcı olmuyor. JIT kullanılarak derlenen kodlar için bunların hiç birisi problem değil çünkü doğru bellek adres referansları çalışma anında hesaplanıyor.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Diğer bir eksi ise kodlar çalışma anında oluşturulmadığından oluşturulmuş kodlar ortam hakkında çalışma anında derlenenler kadar bilgiye sahip olamıyor.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Özellikle sunucu taraflı uygulamalarda NGen kullanmak oldukça gereksiz çünkü performans sorununu,  çoğu zaman kullanıcılar bu yavaşlığın farkında bile olmazlar, sadece ilk kullanıcı yaşıyor. Bir çok sunucu uygulamasında kodun sadece bir instance’ı gerektiğinden diğer kullanıcılar için böyle bir etkilenme yaşanmıyor.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Uygulamanızda NGen kullanmayı düşünüyorsanız NGen tarafından çevrilen kodlarla çalışma anında çevrilenler arasında mutlaka karşılaştırma yapın ve hangisinin daha hızlı olduğundan emin olun. &lt;/font&gt;&lt;/p&gt;&lt;img src="http://ozgurbelul.com/aggbug/10.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Özgür Belül</dc:creator>
            <guid>http://ozgurbelul.com/archive/2008/06/28/ngen.exe--native-code-generator.aspx</guid>
            <pubDate>Fri, 27 Jun 2008 21:49:50 GMT</pubDate>
            <wfw:comment>http://ozgurbelul.com/comments/10.aspx</wfw:comment>
            <comments>http://ozgurbelul.com/archive/2008/06/28/ngen.exe--native-code-generator.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://ozgurbelul.com/comments/commentRss/10.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>