2016-05-27 21 views
9

Üst düzey bir lambda fonksiyonum var ve bu lambda içinde birkaç tane iç içe geçmiş lambda fonksiyonu var.Yuvalama Lambda işlevleri - Performans etkileri

Lambdaları diğer lambdaların içine yerleştirmek iyi bir fikir midir? Herhangi bir performans etkisi var mı?

Örneğin;

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"; 

Yukarıdaki örnekte Multiplier2 ve Multiplier3'ü ayrı işlevlere yeniden yapılandırabilirim. Buna kıyasla daha iyi bir yaklaşım mı?

Şu an üretimde olan bir kodu değiştiriyorum ve bu yüzden ayrı bir işlevde yeniden hesaba katıp katmamayı veya lambda işlevlerini kullanmayı başaramama konusunda bir ikilemde bulundum.

+3

"* Herhangi bir performans etkisi var mı? *" Kapaksız kulağa takılan lambdalar için, kesinlikle değil. – ildjarn

+1

Dürüst soru: Neden sahip olduğunuz ve zamanladığınız konserve örneği etrafında bir döngü sarmıyorsunuz. Sonra refaktöre ve zamana? @ Jar jar jar jar jar jar jar jar points points points points As As As As As As As As As As As As As As As As As As As As As As ild ild ild ild ild ild As ild – Hal

+0

@Hal Haklısınız. En iyi şey zaman ve performans kontrol etmektir. –

cevap

12

Kodlama stili ifadesinin bir sonucu olarak performans etkilerinin sorulması her zaman yanlış bir sorudur.

Derleyici, en iyileştirme yaparken, ifade edilen numaralı belgeyi, kodunuzun düzenini dikkate almaz.

Bu örnek aşırı ama derleyici seçeneği -O2 ile gcc tarafından üretilen kodu göstermeye değer.

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); 
} 

gcc -S -O2 -std=c++14 verim ile derleme: cout kullanılarak üretilecek gürültüyü kaldırmak için yukarıdaki kodu üstlenmeden

optimizasyoncusu aracılığıyla görmüş olduğu

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

Bildirimi tüm kod ve bu kodun alabileceği tek hareketin (önemli olan), emit işlevini 2000 argümanı değeriyle çağırmasıdır.

Ders, her zaman zarifçe niyetini ifade etmelidir (örn. kolayca anlaşılabilir ve korunabilir bir şekilde) ve derleyicinin, en az zamanda ve/veya kod boyutunda bu amacı uygulayan kod yayınlama işini yapmasına izin verir.