そのような機能は存在しますか?サーバーモードで実行されているJavaHotSpotのようなものですが、.Netアプリケーション用です。
編集: もう少し情報。私は小さなアプリケーション(F#で書かれています)を持っていて、その中にたくさんの小さな関数があります。このように:
let printable b =
if b >= ' 'B && b <= '~'B
then b else '.'B
パフォーマンスが悪いことに気づきました。プロファイリングを行った後、そのような関数はすべて何百万回も呼び出されていることがわかりました。私はそれらを作成しinline
、パフォーマンスを向上させました(5倍以上、それ以上かもしれません)。
良いね。パフォーマンスは今は良いです。しかし、なぜフレームワークはそれをしなかったのですか?それは私のコードと関数が呼び出された頻度についての十分な情報を持っています。1M回呼び出された関数をインライン化しないのはなぜですか?
EDIT2: インライン関数の違いを測定するためのサンプルテスト:
open System
let printableByte b =
if b >= ' 'B && b <= '~'B
then b else '.'B
let foo (arr : byte[]) =
for i in 0..arr.Length-1 do
arr.[i] <- printableByte (arr.[i])
arr.Length / 1000
let main() =
let sum = ref 0
let arr = Array.create 1000000 0uy
let stopWatch = System.Diagnostics.Stopwatch()
stopWatch.Start()
for x in 0..5000 do
sum := !sum + (foo arr)
stopWatch.Stop()
printfn "%d" !sum
printfn "total time = %A" stopWatch.ElapsedMilliseconds
()
main()
インライン化されていない場合は19.5秒、printableByte
インライン化されている場合は13.6秒実行されます。
EDIT3: この時間差は、x86ターゲット用にコンパイルされ、x64ホストで実行されている場合にのみ表示できます。「anycpu」またはx64用にコンパイルされた場合、時間差はありません。
したがって、「小さな関数」と最適化に問題はありません。