โครงสร้างที่แตกต่างกันในตัวอย่างจากเบน M มันจะขยายค่าใช้จ่ายในfor
วงด้านในที่จะทำให้มันไม่ได้เป็นการเปรียบเทียบที่ดีระหว่างทั้งสองกรณี
ต่อไปนี้มีความแม่นยำมากขึ้นสำหรับการเปรียบเทียบที่รหัสทั้งหมดเพื่อตรวจสอบ (รวมถึงการประกาศตัวแปร) อยู่ในบล็อกลอง / จับ
for (int j = 0; j < 10; j++)
{
Stopwatch w = new Stopwatch();
w.Start();
try {
double d1 = 0;
for (int i = 0; i < 10000000; i++) {
d1 = Math.Sin(d1);
d1 = Math.Sin(d1);
}
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
finally {
//d1 = Math.Sin(d1);
}
w.Stop();
Console.Write(" try/catch/finally: ");
Console.WriteLine(w.ElapsedMilliseconds);
w.Reset();
w.Start();
double d2 = 0;
for (int i = 0; i < 10000000; i++) {
d2 = Math.Sin(d2);
d2 = Math.Sin(d2);
}
w.Stop();
Console.Write("No try/catch/finally: ");
Console.WriteLine(w.ElapsedMilliseconds);
Console.WriteLine();
}
เมื่อฉันรันรหัสทดสอบดั้งเดิมจากBen Mฉันสังเกตเห็นความแตกต่างทั้งในการกำหนดค่า Debug และ Releas
รุ่นนี้ฉันสังเกตเห็นความแตกต่างในเวอร์ชันการดีบัก (จริง ๆ แล้วมากกว่าเวอร์ชั่นอื่น ๆ ) แต่มันก็ไม่ต่างกันในเวอร์ชั่น Release
Conclution :
จากการทดสอบเหล่านี้ผมคิดว่าเราสามารถพูดได้ว่าลอง / จับไม่ได้มีผลกระทบต่อประสิทธิภาพการทำงานเล็ก ๆ
แก้ไข:
ฉันพยายามเพิ่มค่าลูปจาก 10,000,000 เป็น 1000000000 และวิ่งอีกครั้งใน Release เพื่อรับความแตกต่างบางอย่างในรีลีสและผลลัพธ์คือ:
try/catch/finally: 509
No try/catch/finally: 486
try/catch/finally: 479
No try/catch/finally: 511
try/catch/finally: 475
No try/catch/finally: 477
try/catch/finally: 477
No try/catch/finally: 475
try/catch/finally: 475
No try/catch/finally: 476
try/catch/finally: 477
No try/catch/finally: 474
try/catch/finally: 475
No try/catch/finally: 475
try/catch/finally: 476
No try/catch/finally: 476
try/catch/finally: 475
No try/catch/finally: 476
try/catch/finally: 475
No try/catch/finally: 474
คุณเห็นว่าผลลัพธ์นั้นไม่สมเหตุผล ในบางกรณีเวอร์ชันที่ใช้ Try / Catch เร็วกว่าจริง!