2016-05-27 18 views
9

Tôi có hàm lambda cấp cao nhất và sau đó có vài hàm lambda lồng nhau bên trong lambda này.Hàm Lambda lồng nhau - Hàm ý hiệu suất

Ý tưởng hay là tổ chức lambdas bên trong lambdas khác? Có bất kỳ tác động hiệu suất nào không?

Ví dụ:

auto Multiplier1 = []() -> int 
{ 
    auto Multiplier2 = [](int i) -> int 
    { 
     auto Multiplier3 = [](int i) -> int 
     { 
      return i * 2; 
     }; 
     std::cout << "Calling another lambda 2\n"; 
     return Multiplier3(i * 100); 
    }; 

    int i = 10; 
    std::cout << "Calling another lambda 1\n"; 
    int ret = Multiplier2(i); 
    return ret; 
}; 

int ret = Multiplier1(); 
std::cout << ret << "\n"; 

Trong ví dụ trên, tôi có thể tái nhân tố Multiplier2 và Multiplier3 thành các chức năng riêng biệt. Đó có phải là một cách tiếp cận tốt hơn so với điều này?

Tôi đang sửa đổi mã đã được sản xuất và do đó, tôi đang trong tình thế tiến thoái lưỡng nan có nên xác định lại mã đó thành các hàm riêng biệt hoặc quản lý bằng hàm lambda hay không.

+3

"* Có bất kỳ tác động nào về hiệu suất không? *" Đối với các lambdas vô nghĩa, như bạn có, tuyệt đối không. – ildjarn

+1

Câu hỏi trung thực: Tại sao không quấn một vòng quanh ví dụ đóng hộp bạn có và thời gian. Sau đó, refactor và thời gian đó? Như @ildjarn chỉ ra bạn cần phải chắc chắn chữ ký của những lambdas là chính xác tương đương với lambdas thực bạn có trong sản xuất. – Hal

+0

@Hal Bạn nói đúng. Điều tốt nhất là thời gian và kiểm tra hiệu suất. –

Trả lời

12

Hỏi về ý nghĩa hiệu suất do biểu hiện kiểu mã hóa luôn là câu hỏi sai.

Trình biên dịch, khi tối ưu hóa, xem xét ý định thể hiện, không phải bố cục mã của bạn.

Ví dụ này là cực đoan nhưng nó đáng để hiển thị cho bạn mã được sản xuất bởi gcc với tùy chọn trình biên dịch -O2.

Refactoring mã ở trên để loại bỏ tiếng ồn sẽ được sản xuất bằng cách sử dụng cout:

auto Multiplier1 = []() -> int 
{ 
    auto Multiplier2 = [](int i) -> int 
    { 
     auto Multiplier3 = [](int i) -> int 
     { 
      return i * 2; 
     }; 
     return Multiplier3(i * 100); 
    }; 

    int i = 10; 
    int ret = Multiplier2(i); 
    return ret; 
}; 

extern void emit(int); 

int main() 
{ 
    int ret = Multiplier1(); 
    emit(ret); 
} 

biên soạn với gcc -S -O2 -std=c++14 sản lượng:

main: 
     subq $8, %rsp 
     movl $2000, %edi 
     call emit(int) 
     xorl %eax, %eax 
     addq $8, %rsp 
     ret 

ý rằng optimizer đã nhìn thấy qua tất cả các mã và nhận ra rằng quá trình hành động duy nhất mà mã này có thể thực hiện (quan trọng) là gọi hàm emit với giá trị đối số của năm 2000.

Bài học luôn luôn là bài học nên thể hiện ý định một cách tao nhã (tức là theo cách có thể hiểu và duy trì dễ dàng) và cho phép trình biên dịch thực hiện công việc phát ra mã thực hiện ý định đó trong thời gian và/hoặc kích thước mã ít nhất.

Các vấn đề liên quan