Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Satır içi işlevler , doğrudan çağıran kodla tümleştirilmiş işlevlerdir.
Satır içi İşlevleri Kullanma
Statik tür parametreleri kullandığınızda, tür parametreleri tarafından parametreleştirilen tüm işlevler satır içi olmalıdır. Bu, derleyicinin bu tür parametreleri çözümleyebileceğini garanti eder. Sıradan genel tür parametreleri kullandığınızda, böyle bir kısıtlama yoktur.
Üye kısıtlamalarının kullanımını etkinleştirmenin dışında, satır içi işlevler kodu iyileştirmede yararlı olabilir. Ancak satır içi işlevlerin fazla kullanılabilmesi, kodunuzun derleyici iyileştirmelerindeki değişikliklere ve kitaplık işlevlerinin uygulanmasına karşı daha az dayanıklı olmasını sağlayabilir. Bu nedenle, diğer tüm iyileştirme tekniklerini denemediğiniz sürece, iyileştirme için satır içi işlevleri kullanmaktan kaçınmanız gerekir. İşlev veya yöntemi satır içi yapmak bazen performansı artırabilir, ancak her zaman böyle değildir. Bu nedenle, belirli bir işlevi satır içi yapmanın aslında olumlu bir etkisi olduğunu doğrulamak için performans ölçümlerini de kullanmanız gerekir.
Değiştirici, inline en üst düzeyde, modül düzeyinde veya bir sınıftaki yöntem düzeyinde işlevlere uygulanabilir.
Aşağıdaki kod örneğinde en üst düzeydeki satır içi işlev, satır içi örnek yöntemi ve satır içi statik yöntem gösterilmektedir.
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
Satır içi İşlevler ve Tür Çıkarımı
inline Varlığı, tür çıkarımı etkiler. Bunun nedeni, satır içi işlevlerin statik olarak çözümlenen tür parametrelerine sahip olması, satır içi olmayan işlevlerin ise çözümlenememesidir. Aşağıdaki kod örneğinde, dönüştürme işleci olan statik olarak çözümlenmiş tür parametresine sahip bir işlev kullandığınızdaninline, bunun yararlı olduğu float bir durum gösterilmektedir.
let inline printAsFloatingPoint number =
printfn "%f" (float number)
inline Değiştirici olmadan tür çıkarımı işlevi belirli bir tür almaya zorlar. Bu durumda int. Ancak değiştirici ile inline işlevin statik olarak çözümlenmiş bir tür parametresine sahip olduğu da çıkarılır. Değiştirici ile inline , türü aşağıdaki gibi çıkarılır:
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
Bu, işlevin kayan dönüştürmeyi destekleyen herhangi bir türü kabul ettiğini gösterir.
InlineIfLambda
F# derleyicisi, kod için inlining gerçekleştiren bir iyileştirici içerir.
InlineIfLambda özniteliği, isteğe bağlı olarak kodun bir bağımsız değişkenin lambda işlevi olduğu belirlenirse, bu bağımsız değişkenin her zaman çağrı sitelerinde tek başına çizili olması gerektiğini belirtmesine olanak tanır. Daha fazla bilgi için bkz . F# RFC FS-1098.
Örneğin, bir diziden geçiş yapmak için aşağıdaki iterateTwice işlevi göz önünde bulundurun:
let inline iterateTwice ([<InlineIfLambda>] action) (array: 'T[]) =
for i = 0 to array.Length-1 do
action array[i]
for i = 0 to array.Length-1 do
action array[i]
Arama sitesi şu şekildeyse:
let arr = [| 1.. 100 |]
let mutable sum = 0
arr |> iterateTwice (fun x ->
sum <- sum + x)
Ardından, kod, inlining ve diğer iyileştirmelerden sonra şu hale gelir:
let arr = [| 1..100 |]
let mutable sum = 0
for i = 0 to arr.Length - 1 do
sum <- sum + arr[i]
for i = 0 to arr.Length - 1 do
sum <- sum + arr[i]
Bu iyileştirme, söz konusu lambda ifadesinin boyutundan bağımsız olarak uygulanır. Bu özellik, döngü kaydını kaldırma ve benzer dönüştürmeleri daha güvenilir bir şekilde uygulamak için de kullanılabilir.
Kodunuzda /warnon:3517 bağımsız değişkenlerin çağrı sitelerindeki lambda ifadelerine bağlı olmadığı yerleri belirtmek için bir kabul uyarısı (<WarnOn>3517</WarnOn> veya özelliğiInlineIfLambda) açılabilir. Normal durumlarda bu uyarı etkinleştirilmemelidir. Ancak, belirli yüksek performanslı programlama türlerinde, tüm kodların çizili ve düzleştirilmiş olduğundan emin olmak yararlı olabilir.
Curried geri çağırmalarını iyileştirme
Bir geri çağırma çizilmediğinde tekrarlanan arity uyarlamasını önlemek için F# 11 ile birlikte InlineIfLambdadesteklerOptimizeClosureIfNotInlined:
let inline foldItems
([<InlineIfLambda; OptimizeClosureIfNotInlined>] folder)
state
(items: 'T[]) =
let mutable total = state
for item in items do
total <- folder total item
total
İşlev satır içi olmalı, her iki öznitelik de mevcut olmalı ve geri çağırma iki ile beş arasında bağımsız değişkenle oluşturulmalıdır. Bilinen bir lambda satır içi olabilir; opak geri çağırma bir kez uyarlanabilir. Bunun için FSharp.Core 11 ve derleyici desteği gerekir, ancak sıfır ayırma garantisi vermez.
Satır içi işlevlerde hata ayıklama
Satır içi yardımcılara geçmek için, iyileştirme olmadan derleyin ve hata ayıklama bilgilerini koruyun. F# 11 şu derlemelerde normal çağrıları tercih eder:
let inline addFee (fee: decimal) (amount: decimal) =
let total = amount + fee
total
let invoiceTotal = addFee 2m 40m
printfn "%M" invoiceTotal
// 42
Örnek projede üzerinde let totalbir kesme noktası ayarlayın, içine addFeegeçin ve bağımsız değişkenlerini inceleyin.
İyileştirilmiş derlemeler varsayılan olarak satır içi olarak kalır. Sabit kod ve statik genişletme gerektiren işlemler de dahil olmak üzere bazı yapıların, iyileştirme olmadan bile satır içinde olması gerekir. Eski davranışı istemek için kullanın --always-inline .
Kitaplıklar arasında satır içi uzantı kısıtlamaları
F# 11.2, SRTP gereksinimlerini karşılamak için genel uzantı üyelerini kullanabilir. Bkz. Dil ayarları, kapsam ve kitaplık gereksinimleri için SRTP kısıtlamaları için uzantı üyeleri .