Inlinefunktionen

Inlinefunktionen sind Funktionen, die direkt in den aufrufenden Code integriert sind.

Verwenden von Inlinefunktionen

Wenn Sie statische Typparameter verwenden, müssen alle Funktionen, die nach Typparametern parametrisiert sind, inline sein. Dadurch wird sichergestellt, dass der Compiler diese Typparameter auflösen kann. Wenn Sie gewöhnliche generische Typparameter verwenden, gilt keine solche Einschränkung.

Abgesehen von der Ermöglichung der Verwendung von Membereinschränkungen können Inlinefunktionen bei der Optimierung von Code hilfreich sein. Die übermäßige Verwendung von Inlinefunktionen kann jedoch dazu führen, dass Ihr Code weniger widerstandsfähig gegenüber Änderungen in Compileroptimierungen und der Implementierung von Bibliotheksfunktionen ist. Aus diesem Grund sollten Sie die Verwendung von Inlinefunktionen zu Optimierungszwecken vermeiden, es sei denn, Sie haben alle anderen Optimierungstechniken ausprobiert. Durch Definieren einer Funktion oder Methode als „inline“ kann mitunter die Leistung verbessern, was aber nicht immer der Fall ist. Daher sollten Sie auch Leistungsmessungen vornehmen, um zu prüfen, ob eine bestimmte als „inline“ definierte Funktion tatsächlich einen positiven Effekt hat.

Der Modifizierer inline kann auf Funktionen auf oberster Ebene, auf Modulebene oder auf Methodenebene in einer Klasse angewendet werden.

Das folgende Codebeispiel veranschaulicht eine Inlinefunktion auf oberster Ebene, eine Inline-Instanzmethode und eine statische Inlinemethode.

let inline increment x = x + 1
type WrapInt32() =
    member inline this.incrementByOne(x) = x + 1
    static member inline Increment(x) = x + 1

Inlinefunktionen und Typrückschluss

Das Vorhandensein von inline wirkt sich auf den Typrückschluss aus. Dies liegt daran, dass Inlinefunktionen statisch aufgelöste Typparameter aufweisen können, während dies bei Nicht-Inlinefunktionen nicht der Fall ist. Das folgende Codebeispiel zeigt einen Fall, in dem inline hilfreich ist, da Sie eine Funktion mit einem statisch aufgelösten Typparameter, dem Konvertierungsoperator float, verwenden.

let inline printAsFloatingPoint number =
    printfn "%f" (float number)

Ohne den Modifizierer inline zwingt der Typrückschluss die Funktion einen bestimmten Typ zu verwenden, in diesem Fall int. Aber mit dem Modifizierer inline erfolgt auch der Rückschluss, dass die Funktion einen statisch aufgelösten Typparameter hat. Mit dem Modifizierer inline erfolgt ein Rückschluss auf den folgenden Typ:

^a -> unit when ^a : (static member op_Explicit : ^a -> float)

Dies bedeutet, dass die Funktion jeden Typ akzeptiert, der eine Konvertierung in float unterstützt.

InlineIfLambda

Der F#-Compiler enthält einen Optimierer, der ein Inlining des Codes ausführt. Das InlineIfLambda-Attribut ermöglicht Code optional anzugeben, dass, wenn ein Argument als Lambdafunktion festgelegt wird, dieses Argument in Aufrufsites stets inline sein soll. Weitere Informationen finden Sie unter F# RFC FS-1098.

Betrachten Sie beispielsweise die folgende iterateTwice-Funktion zum Durchlaufen eines Arrays:

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]

Wenn die Aufrufseite folgendermaßen lautet:

let arr = [| 1.. 100 |]
let mutable sum = 0
arr  |> iterateTwice (fun x ->
    sum <- sum + x)

Dann sieht der Code nach Inlining und anderen Optimierungen so aus:

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] 

Diese Optimierung wird unabhängig von der Größe des beteiligten Lambdaausdrucks angewendet. Dieses Feature kann auch verwendet werden, um die Auflösung von Schleifen und ähnliche Transformationen zuverlässiger zu implementieren.

Eine optionale Warnung (/warnon:3517 oder <WarnOn>3517</WarnOn>-Eigenschaft) kann aktiviert werden, um Stellen in Ihrem Code anzugeben, an denen InlineIfLambda-Argumente nicht an Lambdaausdrücke in Aufrufsites gebunden sind. In normalen Situationen sollte diese Warnung nicht aktiviert werden. Bei bestimmten Arten der Hochleistungsprogrammierung kann sie jedoch hilfreich sein, sicherzustellen, dass der gesamte Code inline und vereinfacht ist.

Siehe auch