F#向下转慢?

时间:2015-07-13 18:47:57

标签: events f# abstract-class performance-testing downcast

我有一种情况,我需要使用:?>在一个程序中向下转发两次。我有一个自定义EventArgs类(继承System.EventArgs),以及该自定义EventArgs中的抽象类实例。收到活动后,我需要垂头丧气两次。一次用于自定义EventArgs,一次用于该自定义EventArgs中的抽象类。我每天必须做数百万次这样的事情,所以我想知道是否有任何关于向下倾斜的内在缓慢。

1 个答案:

答案 0 :(得分:4)

对于笑话,我把以下小功能放在一起:

let castToStream (o:Object) = o :?> Stream

并使用以下代码调用它:

[<EntryPoint>]
let main argv = 
    let stm1 = new FileStream("output.tmp", FileMode.Create, FileAccess.ReadWrite, FileShare.Read)
    let obj = stm1 :> Object
    let stm2 = castToStream obj
    0 // return an integer exit code

编译时,castToStream变成了这个IL:

.method public static class [mscorlib]System.IO.Stream 
    castToStream(object o) cil managed
{
  // Code size       8 (0x8)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  unbox.any  [mscorlib]System.IO.Stream
  IL_0007:  ret
} // end of method Program::castToStream

在这种情况下实际上是1个实际指令,unbox.any。 Unbox.any用于引用类型等同于castclass指令。从the description开始,如果某个类型尚未加载,您将进行一次性初始点击以加载该类型,然后它将成为确定是否需要的任何魔法类型是等价的(可能使用Type.IsAssignableFrom(),但我不确定)。但是,除非您的类层次结构非常深(并且它不应该),否则我希望在典型的计算机上采用微秒

对于好奇,我最初有castToStream内联的代码,但f#编译器通过我的恶作剧看到并完全删除了所有的转换。