Freigeben über


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 werden, inline sein. Dadurch wird sichergestellt, dass der Compiler diese Typparameter auflösen kann. Wenn Sie normale generische Typparameter verwenden, gibt es keine solche Einschränkung.

Neben der Aktivierung der Verwendung von Membereinschränkungen können Inlinefunktionen bei der Optimierung von Code hilfreich sein. Die Übernutzung von Inlinefunktionen kann jedoch dazu führen, dass der Code weniger widerstandsfähig gegenüber Änderungen an Compileroptimierungen und der Implementierung von Bibliotheksfunktionen ist. Aus diesem Grund sollten Sie die Verwendung von Inlinefunktionen zur Optimierung vermeiden, es sei denn, Sie haben alle anderen Optimierungstechniken ausprobiert. Das Erstellen einer Funktion oder Methode inline kann manchmal die Leistung verbessern, aber das ist nicht immer der Fall. Daher sollten Sie auch Leistungsmessungen verwenden, um zu überprüfen, ob eine bestimmte Funktion inline tatsächlich einen positiven Effekt hat.

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

Im folgenden Codebeispiel wird eine Inlinefunktion auf oberster Ebene, eine Inlineinstanzmethode und eine inline statische Methode veranschaulicht.

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

Inlinefunktionen und Typinference

Das Vorhandensein von inline Auswirkungen auf die Typeinleitung. Dies liegt daran, dass Inlinefunktionen statisch aufgelöste Typparameter aufweisen können, während Nicht-Inlinefunktionen nicht möglich sind. Das folgende Codebeispiel zeigt einen Fall, in inline dem hilfreich ist, da Sie eine Funktion verwenden, die einen statisch aufgelösten Typparameter aufweist, den float Konvertierungsoperator.

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

Ohne den inline Modifizierer erzwingt die Typausleitung die Funktion, einen bestimmten Typ in diesem Fall intzu übernehmen. Aber mit dem inline Modifizierer wird die Funktion auch abgeleitet, um einen statisch aufgelösten Typparameter zu haben. Bei dem inline Modifizierer wird der Typ abgeleitet, um Folgendes zu sein:

^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 codeinriert. Mit dem InlineIfLambda Attribut kann optional angegeben werden, dass, wenn ein Argument als Lambda-Funktion bestimmt wird, dieses Argument selbst immer an Aufrufstandorten inline sein sollte. Weitere Informationen finden Sie unter F# RFC FS-1098.

Betrachten Sie beispielsweise die folgende iterateTwice Funktion, um ein Array zu durchlaufen:

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 es sich bei der Anrufwebsite um Folgendes handelt:

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

Anschließend wird der Code nach der Inlineierung und anderen Optimierungen zu:

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 Lambda-Ausdrucks angewendet. Dieses Feature kann auch verwendet werden, um die Registrierung von Schleifen und ähnlichen Transformationen zuverlässiger zu implementieren.

Eine Opt-In-Warnung (/warnon:3517 oder Eigenschaft <WarnOn>3517</WarnOn>) kann aktiviert werden, um Orte in Ihrem Code anzugeben, an denen InlineIfLambda Argumente nicht an Lambda-Ausdrücke an Aufrufwebsites gebunden sind. In normalen Situationen sollte diese Warnung nicht aktiviert werden. In bestimmten Arten von Hochleistungsprogrammierung kann es jedoch hilfreich sein, sicherzustellen, dass der gesamte Code inlineiert und abgeflacht ist.

Siehe auch