ก่อนที่เราจะไปวัดประสิทธิภาพของ JITCompiler เรามารู้จักเครื่องมือวัดที่เราสามารถใช้ได้ก่อนครับ ปกติเครื่องมือวัดของเราสามารถใช้ได้ดังนี้
1.TimeSpan
เรามาทดลองใช้ TimeSpan ในการวัด performance ของ code ข้างล่างดูน่ะครับ
public static void TestCounter()
{
DateTime start = DateTime.Now;
Console.WriteLine(start.ToString("dd/MM/yyyy hh:mm:ss:fff"));
int counter = 0;
for (int i = 0; i < 100; i++)
counter++;
DateTime stop = DateTime.Now;
Console.WriteLine(stop.ToString("dd/MM/yyyy hh:mm:ss:fff"));
TimeSpan duration = DateTime.Now.Subtract(start);
Console.WriteLine(duration.Milliseconds + " millisecond");
}
public static void Main(string[] args)
{
for (int NumberOfTry = 0; NumberOfTry < 3; NumberOfTry++)
{
TestCounter();
Console.WriteLine("Press any key to do one more time");
Console.ReadLine();
}
}
นี้คือ ผลที่ได้จากการ execute โปรแกรมน่ะครับ
จากผลการทดลองจะเห็นว่าเมื่อเรา execute function TestCounter() ครั้งที่ 1 เราต้องใช้เวลาประมาณ 42 millisecond แต่พอเรา execute ครั้งที่ 2 และครั้งที่ 3 ผลการ execute กลับใช้เวลาน้อยกว่า 1 millisecond ซึ่งตรงกับที่เราเข้าใจว่าเมื่อถูก execute ครั้งแรก JITCompiler จะ compile IL code ไปเป็น Native CPU code และพอ execute ครั้งที่สองเป็นต้นไปก็เป็นการเรียกใช้ Native CPU code ที่ถูก compile เสร็จแล้วได้เลย
ข้อเสียของ TimeSpan คือ หน่วยที่เล็กที่สุดที่วัดได้คือ millisecond เนื่องจากเราอยากรู้ว่าการ execute function TestCounter() ครั้งที่ 2 กับครั้งที่ 3 ใช้เวลาเท่าไร ด้งนั้น TimeSpan จึงไม่ใช่เครื่องมือวัดที่ละเอียดพอครับ
2.Stopwatch
Stopwatch ที่มีอยู่ใน .Net Framework ต่ำกว่า version 4.5 จะมีความสามารถเหมือนกับ TimeSpan คือสามารถจับระยะเวลาความแตกต่างได้แค่ระดับ millisecond เท่านั้น
แต่ Stopwatch ที่มีอยู่ใน version 4.5 ขึ้นไป สามารถวัดได้ในระดับ microsecond แต่ CPU และ Windows ที่ใช้ execute โปรแกรมจะต้องเป็นชนิด high frequency เท่านั้นถึงจะจับความแตกต่างในระดับ microsecond ได้
เนื่องจาก Visual Studio ของผมยังเป็น version 2013 อยู่ผมจึงไม่สามารถเขียน code ของ Framework 4.5 ได้ แต่ผู้อ่านสามารถดูได้จากตัวอย่างนี้น่ะครับ
ถ้าอยากดู source code ของ Stopwatch ของ .Net Framework สามารถดูได้ที่ link นี้ครับ
2.Stopwatch
Stopwatch ที่มีอยู่ใน .Net Framework ต่ำกว่า version 4.5 จะมีความสามารถเหมือนกับ TimeSpan คือสามารถจับระยะเวลาความแตกต่างได้แค่ระดับ millisecond เท่านั้น
แต่ Stopwatch ที่มีอยู่ใน version 4.5 ขึ้นไป สามารถวัดได้ในระดับ microsecond แต่ CPU และ Windows ที่ใช้ execute โปรแกรมจะต้องเป็นชนิด high frequency เท่านั้นถึงจะจับความแตกต่างในระดับ microsecond ได้
เนื่องจาก Visual Studio ของผมยังเป็น version 2013 อยู่ผมจึงไม่สามารถเขียน code ของ Framework 4.5 ได้ แต่ผู้อ่านสามารถดูได้จากตัวอย่างนี้น่ะครับ
ถ้าอยากดู source code ของ Stopwatch ของ .Net Framework สามารถดูได้ที่ link นี้ครับ
ด้วยข้อจำกัด Stopwatch ในเรื่องของ require .Net Framework 4.5 ขึ้นไปและต้องการ CPU กับ Windows ที่เป็น high frequency ดังนั้น Stopwatch จึงยังไม่ใช่ตัวเลือกที่ดีพอสำหรับเรา
บทความหน้าผมจะแสดงให้ดูถึงเครื่องมือวัดในระดับ microsecond โดยใช้ UnManaged code ของ library พื้นฐานของ Windows ซึ่งจะเป็นยังไงพบกันใหม่บทความหน้าครับ
บทความหน้าผมจะแสดงให้ดูถึงเครื่องมือวัดในระดับ microsecond โดยใช้ UnManaged code ของ library พื้นฐานของ Windows ซึ่งจะเป็นยังไงพบกันใหม่บทความหน้าครับ
TuChay
ไม่มีความคิดเห็น:
แสดงความคิดเห็น