Satır İçi İşlevler

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ızdanfloat, bunun yararlı olduğu inline 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 InlineIfLambda bağımsız değişkenlerin çağrı sitelerindeki lambda ifadelerine bağlı olmadığı yerleri belirtmek için bir kabul uyarısı (/warnon:3517 veya özelliği<WarnOn>3517</WarnOn>) 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.

Ayrıca bkz.