EDIT: Sau khi loại bỏ UB (vị trí tốt, tôi bỏ qua nó), thời gian là nhiều hơn hoặc ít giống hệt nhau. Sẽ gắn cờ một người kiểm duyệt để xóa nó.Tại sao di chuyển trở lại vào cuối chức năng kém hiệu quả?
Hai chức năng giống hệt nhau ngoại trừ một thực tế rằng foo
có sự trở lại bên trong if
, trên cả hai chi nhánh, trong khi goo
có một đơn return
ở cuối:
int foo()
{
static int x = 0;
if (x)
{
x > 2 ? x = 0 : ++x;
return x-1;
}
else
{
x++;
return x-1;
}
}
int goo()
{
static int x = 0;
if (x)
{
x > 2 ? x = 0 : ++x;
}
else
{
x++;
}
return x-1;
}
Những con số đang có chỉ để tối ưu hóa không khởi động quá mạnh và cuộc gọi hàm không được tối ưu hóa. Biên soạn với đầy đủ tối ưu hóa trên MSVS 2010.
Gọi chức năng 4000000000 lần, lấy mẫu 10 lần, foo
là luôn nhanh hơn:
foo
- 8830 ms trung bìnhgoo
- 8703 ms trung bình
Sự khác biệt là nhỏ, nhưng nó ở đó. Tại sao? Ngoài ra, tại sao trình biên dịch không tối ưu hóa chúng với cùng một thứ?
Bạn đã kiểm tra đầu ra của bộ kết hợp chưa? –
@larsmans yes, chức năng được gạch chân và phần đầu tiên là * lớn hơn * (mặc dù phải mất ít hơn). Tôi cũng đang xem xét các lý do ** tại sao ** trình biên dịch không thấy bất kỳ sự tối ưu hóa nào mà nó làm cho một trong số chúng. –
Bạn đã xem mã ASM đã được sản xuất chưa? –