有这样的功能吗?类似 Java HotSpot 的东西在服务器模式下运行,但适用于 .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 编译,则没有时间差异。
因此,“小功能”和优化没有任何问题。