Nine MVP's Blog

26/06/2006

– มาติด Turbo ให้ App ตอน Start App ด้วย NGen Tool (จะหายสงสัยทำไม .NET ไม่เปิดปุ๊บติดปั๊บแบบ VB6)

Filed under: Uncategorized — Nine MVP @ 10:58 pm
มีเสียงบ่นกันมากมายเหลือเกินนะครับ ทำไม ๆ ๆ เปิดโปรแกรมแล้วมันช้างี้ หน่วง ๆ มากมาย ไม่เห็นเหมือน VB6 เลย
แบบเรียกปุ๊บโผล่ปั๊บ เปิดปั๊บติดปุ๊บ อะไรทำนองนี้ จะได้หายสงสัยกันซะที
มาเข้าเรื่องกันเลยดีกว่า
 
พระเอกของเรางานนี้คือ NGen.exe Tool
เจ้าตัว NGen tool นั้นได้มีติดมากับ .Net Fx ทุก version ซึ่ง Tool ตัวนี้มีมาตั้งแต่สมัย .Net fx 1.0  แล้ว
และ MS ก็ใช้มันทำ Core dll ต่าง ๆ ของ .Net Fx ในตอนติดตั้งด้วยซึ่งจะ build ลง GAC นั้นเอง
 
เป็นที่ทราบกันดีว่า JIT(Just-In-Time) ถูกใช้เป็น Compiler เพื่อทำการคอมไพล์ MSIL Code (Exe, DLL) ของโปรแกรมที่เราสร้างขึ้นจาก .NET
และจะแปลง MSIL Code เหล่านี้ไปเป็น Native Code ของเครื่อง ก่อนที่จะทำการ execute code นั้น ๆ
ตัว code ส่วนนี้จะถูกสร้างขึ้นชั่วคราวทุกครั้ง ที่มี Process การทำงานเรียกใช้ในครั้งแรก
และจะถูกทำลายทิ้งเมื่อจบโปรเซส(ใน .net fx 2.0 จะมีการเก็บ code นี้ไว้ใน temp ไว้เพื่อให้ใช้งานทำให้เปิดโปรแกรมครั้งที่ 2 ทำได้รวดเร็วขึ้น แต่จะถูกลบเมื่อมีการ reboot เครื่องใหม่)
 
ตัว NGen นั้น พูดได้ว่าเป็นการข้ามขั้นตอนการ Compile exe,dll ต่าง ๆ ที่เราเรียกใช้
จาก JIT คือเราจะไปทำ Image ไว้ให้ CLR เรียกใช้โดยตรงได้เลย จากใน GAC
 
อธิบายการทำงานของ NGen
เราจะเรียกว่า เป็นการทำ Precompile หรือ pre-JITing
คือการสร้าง native code ของ MSIL ไว้บนเครื่องที่มีการใช้งานโปรแกรม
และผลทีได้จาก pre-JITing จะเป็น native code ซึ่งใช้แทนการ compile code ของ JIT ทุกครั้งที่มีการรันโปรแกรม
ตัว Native code ที่ได้จาก Ngen จะเป็น Win32 PE code จริง ๆ ซึ่งเช่นเดียวกับ VB6 (เปิดปุ๊บติดปั๊บ)
แต่เราจะเรียกกันว่า native images หรือ ngen images
ซึ่งจะถูกเก็บลงไปเป็น native image cache หรือ Ngen cache (GAC)
ขั้นตอนการทำงานขณะสร้าง Native Images ของ NGen
1. ต่อมาจะเรียก JIT มาทำการ Compile MSIL Code เพื่อสร้าง native code จาก exe หรือ dll
2. ซึ่งเมือ่ได้ทำการสร้าง native image แล้วก็เก็บลง native image cache (GAC)
 
ขั้นตอนการทำงานเมื่อเราเรียกใช้ Application ที่ได้สร้าง Native Images ไว้
เมื่อมีการเปิด App หรือจะ load DLL ตัว CLR จะทำการค้นหาที่ตั้งของ exe/dll ที่ได้ทำ Image ไว้แล้วไป query  ใน Native Image Cache และจะทำการ Load Image จาก GAC มาใช้งาน
 
 
มาดูกันใช้ยังงัย NGen ใน .NET FX 2.0

เราสามารถใช้ NGen ใน command line (DOS) ครับโดยตัว NGen.exe จะอยู่ที่ C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

โดยที่เราสามารถจะใช้กับ Exe, DLL ก็ได้ครับ เพราะเป็น MSIL เหมือนกัน(ยังไม่ขอพูดถึงคำสั่ง update)
 
คำสั่งที่ใช้ในการ Install ก็คือ
>NGen install fileName.exe
คำสั่งที่จะใช้ Uninstall ก็คือ
>NGen uninstall fileName.exe
 
หลังจากได้ ติดตั้งดูแล้วก็ใช้คำสั่ง Display เพื่อดูว่า Native Images ที่เราสร้างนั้นได้ติดตั้งลงใน GAC จริงหรือยังด้วยคำสั่ง
>NGen display fileName.exe
หรืออยากเห็นอะไรแบบเป็นรูปร่างมากกว่า DOS ก็ไปดูได้ที่
Administrative Tools -> Microsoft .NET Framework 2.0 Configuration ->
แล้วก็ดูใน List หาชื่อ exe / dll ที่ใช้ จะพบว่า Native Image ของเราลง GAC ไปเรียบร้อยแล้ว
 
แล้วต่างกันยังงัย กับเอา DLL ลง GAC เองเลย
DLL ที่เราเอาลง GAC เองนั้น เพียงแค่ทำการ Share กันใช้ระหว่าง appต่าง ๆ เท่านั้น และยังคงต้องผ่านการ Compile จาก JIT เพื่อสร้าง Native Code อยู่ครับ และมี Cache Type เป็น GAC สามารถ remove ได้ทันที จาก Microsoft .NET Framework 2.0 Configuration หรือ GACUtil
 
แต่ Native Image ที่เราได้สร้างขึ้นนั้นนอกจะจะสามารถ share กันใช้งานได้แล้ว อีกทั้งยังไม่ต้องผ่านขั้นตอนการ Compile จาก JIT และมี Cache Type เป็น Zap(ทำไมใช้ชื่อ แซ่บ ก็ไม่รู้สิครับ)  และไม่สามารถ remove ออกได้จาก tools ของ GAC แต่ต้อง uninstall โดยใช้ NGen เท่านั้น
 
เท่านี้เราก็สามารถ เปิด App แบบทันใจใช้งาน เหมือน VB6 แล้ว (ไม่น้อยหน้าเรื่องความเร็วกันแล้วนะ หุหุ)
 
 
ปล. ผิดพลาดประการใด ขออภัยไว้ ณ ที่นี้ด้วยครับ ผมก็เพิ่งจะใช้เหมือนกัน หุหุ

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

%d bloggers like this: