2012-03-14 19 views
43

documentation devletler: SIRALI "Beni satır içi lütfen" diyor ikenINLINABLE işlevini bir işlev için kullanmamanın bir nedeni var mı?

  • , INLINABLE diyor ki:

    bir {- - # INLINABLE f #} bir işlev f üzerinde Pragma aşağıdaki davranış vardır “Bana hitap etme özgürlüğüne sahip ol, kendi takdirini kullan”. Diğer bir deyişle, seçim, pragma içermeyen işlevlerle aynı kuralları kullanan GHC'ye bırakılır. INLINE'dan farklı olarak, bu karar çağrı yerinde yapılır ve bu nedenle, inline eşiği, optimizasyon seviyesi vb. Etkiden etkilenecektir.

  • INLINE gibi INLINABLE pragma, orijinal RHS'nin satır içi kullanım için bir kopyasını muhafaza eder ve devam eder. RHS'nin boyutundan bağımsız olarak arayüz dosyasında.

  • INLINABLE'ı kullanmanın bir yolu, satır içi özel işlevle (Bölüm 7.18, “Özel yerleşik işlevler”) bağlantılıdır. Inline f çağrısı f satır içi çok zor çalışır. F'nin satır içi olabildiğinden emin olmak için, F'nin tanımını INLINABLE olarak işaretlemek iyi bir fikirdir; böylece GHC, ne kadar büyük olduğuna bakılmaksızın bir açılımı ortaya çıkarmayı garanti eder. Üstelik, F INCINABLE olarak ek açıklama yaparak, f GHC'nin optimiser'inin gelişigüzel optimize edilmiş versiyonu üretilmesinden ziyade, orijinal RHS'nin satır içi olduğundan emin olursunuz.

  • INLINABLE pragma ayrıca SPECIALIZE ile de çalışır: f işlevini INLINABLE olarak işaretlerseniz, daha sonra başka bir modülde SPECIALIZE yapabilirsiniz (bkz. Bölüm 7.16.8, “SPECIALIZE pragma”). INLINE'dan farklı olarak, özyinelemeli bir işlevde INLINABLE bir pragma kullanmak tamam değildir. asıl nedeni,

bunun dezavantajı nedir uzmanlaşmak

sonraki kullanımına izin vermek için yapmak?

Arabirim dosyalarını çok mu daha büyük yapıyor? Derleme çok daha yavaş mı?

Yazdığım her ihraç işlevine INLINABLE pragma koymamam için herhangi bir neden var mı? GHC'nin yazdığım her ihraç işlevine INLINABLE pragma koymaması için herhangi bir sebep var mı?

cevap

49

hiç bir pragma kullanarak INLINABLE kullanarak değil arasındaki üç fark vardır:

  • INLINABLE olmadan, arayüz dosyasında gider tanım optimizasyon sonrasında kodu olan INLINABLE ile, oysa, o yazdığınız kod (daha fazla veya daha az). Özellikle, INLINABLE olmaksızın, GHC, diğer işlevlerin işlev tanımında satır içi olabilir.

  • INLINABLE olmadan, GHC çok büyükse, arabirim dosyasındaki tanımlamayı çıkarır. Başka bir işlev sağ tarafa doğru çizilirse, bu sınırın üzerine kolayca basabilir.

  • INLINABLE aynı zamanda, kullanıldığı yerde aşırı yüklenmiş işlevleri otomatik olarak yapan bazı akıllı makineleri de çalıştırır ve özel sürümleri, özel sürümün oluşturulduğu modülü geçici olarak içe aktaran diğer modüller ile paylaşır.

+9

Pratik sonuçları anlamaya çalışıyorum. İlk nokta, fonksiyonun satır içinde yer almaması anlamına geldiğinde, bu, iyi olmayan kodu kullanacak ve daha yavaş olacak mıdır? Yoksa satır içi olsun, ancak kurallar ateş etmiyorsa daha yavaş mı olacak? Veya bazen daha hızlı, bazen duruma göre daha yavaş olacak mı? İkinci nokta ile ilgili olarak, disk alanı dışındaki arayüz dosyasına dahil edilmesinde herhangi bir sakınca var mı? Bu kadar büyük olurlarsa sorun olur mu (diskler büyüktür)? Ve re: üçüncü nokta, bir şey iyi olmayan bir şey değil mi? Sorunlu miktarda kod bloğu neden olabilir mi? – glaebhoerl

+4

Kasıtlı olarak uygulamalı sonuçlar hakkında konuşmaktan kaçındım çünkü çoğu durumda emin değilim :-) Ben Simon PJ'yi INLINABLE eklemek için ikna ettim çünkü çok fazla kod patlamasına neden olmayan INLINE'ın bir çeşidini istedim çünkü GHC'nin zaten ne zaman kullanılacağı konusunda oldukça gelişmiş sezgisel bilgiler. İlk sorunuzu cevaplamak için: hayır, orijinal modülde (INLINE ile olduğu gibi) derlenmiş olan işlevin optimize edilmiş bir sürümü de olacak ve bu, satır içi olmayan çağrılar için kullanılacaktır. Arayüzde çok sayıda fonksiyon tanımı dahil, işleri yavaşlatabilir. –

+0

Hmm, tamam. Ne zaman kullanacağınız ve kullanmayacağınız zamanla ilgili bazı kurallara sahip olmak güzel olurdu, ama sanırım denemeliyim. :) – glaebhoerl

İlgili konular