varsayalım Aşağıdaki kod var:derleyici Öner için seçici satır içi işlevi çağırır
struct Foo {
void helper() { ... }
void fast_path() { ...; helper(); ... }
void slow_path1() { ...; helper(); ... }
void slow_path2() { ...; helper(); ... }
};
fast_path()
performans kritik ve bu yüzden her (makul) çaba mümkün olduğunca hızlı yapmak yapılmalıdır olduğu yöntemi. slow_path1()
ve slow_path2()
yöntemleri performans açısından kritik değildir.
Anlayışımdan, tipik bir derleyici bu koda bakabilir ve helper()
, birden çok yöntem işlevi arasında paylaşıldığı için toplam komut boyutunu azaltmak için yeterince karmaşıksa helper()
satır içi satır aramamasına karar verebilir. Yavaş yol yöntemleri yoksa, aynı derleyici helper()
satır içi olabilir.
Verilen bizim arzu performans özellikleri, biz derleyici fast_path()
içine helper()
çağrısını satır içi ama slow_path1()
ve slow_path2()
yılında derleyici'nın varsayılan davranışını tercih etmek istiyorum.
Bir geçici çözüm derleyici fast_path()
paylaşılır helper()
bir kullanım görür asla böylece, yavaş yol işlev tanımları ve ayrı derleme birimlerinde canlı fast_path()
çağrısını sahip olmaktır. Ancak bu ayrımı korumak özel dikkat gerektirir ve derleyici aracılığıyla zorlanamaz. Ayrıca, dosyaların (Foo.h, FooINLINES.cpp ve şimdi de Foo.cpp) çoğalması arzu edilmez ve ek derleme birimleri belki de sadece bir başlık kütüphanesi olabilirdi.
Daha iyi bir yolu var mı?
İdeal Böyle kullanabilirsiniz yeni do_not_inline_function_calls_inside_me
C++ anahtar sözcüğü isterdim: Alternatif
do_not_inline_function_calls_inside_me void slow_path1() { ... }
do_not_inline_function_calls_inside_me void slow_path2() { ... }
, bir inline_function_calls_inside_me
anahtar kelimeyi böyle: Bu varsayımsal anahtar süslemeleri olduğunu
inline_function_calls_inside_me void fast_path() { ... }
Not *_path*()
yöntemleri, helper()
yöntemini değil.
Bu tür bir performans gereksinimine sahip olabileceğiniz örnek bir bağlamda, her katılımcının A ve B türlerinin genel global yayınlarını dinleyen bir uygulama yazdığı bir programlama yarışmasıdır. B tipi yayınlar alındığında, her uygulamada Daha önce yayınlanmış A tipi mesajların sırasına bağlı bir hesaplama yapın ve hesaplama sonucunu merkezi bir sunucuya gönderin. Her bir B tipi yayın için ilk doğru cevaplayıcı bir puan alır. Hesaplamalı problemin doğası, ön-hesaplamanın tip-A güncellemelerinde yapılmasına izin verebilir; Bunları hızlı bir şekilde yapmanın bir avantajı yok.
Bir işlevin satır içine alınmasını engelleyen teknikler, derleyiciye özeldir. Tıpkı bir işlevi garanti eden tekniklerin belirtildiği gibi. Her neyse, öneriniz kusurlu ve "erken bir optimizasyon" zihniyetini gösterir. Bir fonksiyonun "performans açısından kritik" olduğu bir senaryo, pratikte, anlamsız olduğu kadar nadirdir. Programcılar, kodlarındaki performans noktalarını tanımladıklarını düşündüklerinden daha az yeteneklidirler - bu yüzden profilleyiciler gibi araçlar mevcuttur. – Peter
@Peter Performans kritik kod yolları uygulamada nadir olabilir, ancak mevcutlar. Özellikle gcc ile ilgileniyorum. – dshin
gcc ile '__attribute __ ((always_inline))' öğesini belirtebilirsiniz. –