Tôi đã đo thời gian thực hiện cho hai cách tính lũy thừa của 2:C#: Tại sao cuộc gọi hàm nhanh hơn so với nội tuyến thủ công?
1) Inline
result = b * b;
2) Với chức năng cuộc gọi đơn giản
result = Power(b);
Khi chạy trong chế độ Debug, mọi thứ đều như mong đợi: Gọi một hàm đắt hơn đáng kể so với thực hiện phép tính theo dòng (385 ms trong dòng so với 570 ms gọi hàm).
Trong chế độ phát hành, tôi mong đợi trình biên dịch tăng tốc thời gian thực hiện của cuộc gọi hàm đáng kể bởi vì trình biên dịch sẽ nội dòng hàm rất nhỏ Power()
. Nhưng tôi không mong đợi các chức năng gọi là nhanh hơn so với tính toán inlined thủ công.
Đáng ngạc nhiên nhất là trường hợp này: Trong bản phát hành, lần chạy đầu tiên cần 109 ms và lần chạy thứ hai với lệnh gọi tới số Power()
chỉ cần 62 ms.
Cách gọi hàm nhanh hơn so với hướng dẫn thủ công?
Dưới đây là chương trình cho sinh sản của bạn:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Test");
// 1. Calculating inline without function call
Stopwatch sw = Stopwatch.StartNew();
for (double d = 0; d < 100000000; d++)
{
double res = d * d;
}
sw.Stop();
Console.WriteLine("Checked: " + sw.ElapsedMilliseconds);
// 2. Calulating power with function call
Stopwatch sw2 = Stopwatch.StartNew();
for (int d = 0; d < 100000000; d++)
{
double res = Power(d);
}
sw2.Stop();
Console.WriteLine("Function: " + sw2.ElapsedMilliseconds);
Console.ReadKey();
}
static double Power(double d)
{
return d * d;
}
}
Bạn có bắt đầu chương trình trong trình gỡ lỗi (F5) không? Trong trường hợp đó tối ưu hóa đã bị đàn áp. – usr
Bạn có chạy .exe được tạo hoặc trong VS ở chế độ phát hành không? Ngoài ra, bạn đã thử gọi chúng theo các đơn đặt hàng khác nhau chưa? Tôi đã tìm thấy điều này làm cho một sự khác biệt tinh tế – DGibbs
Vâng, tại sao sử dụng một int ** như là một đôi ** nhanh hơn so với chỉ sử dụng một đôi? – Vercas