嵌入单声道 - 原生的开销 - >托管上下文切换

时间:2009-08-17 23:53:50

标签: c# mono jit

任何人都有关于本地开销的任何细节 - > Mono中的托管上下文切换?即通过使用C API调用.NET方法/创建.NET对象而导致的开销。

2 个答案:

答案 0 :(得分:5)

从C代码调用托管方法的当前API具有以下类型的开销:

  • 它执行一些锁定和哈希查找操作,以查看您正在调用的方法和合成的帮助方法是否已编译
  • 如果方法尚未编译为本机代码,则编译它们
  • 实际的方法调用很快,与某些答案中的推测相反,没有编组开销,因此blittable类型和其他此类注意事项不适用
  • 如果返回类型是valuetype,则该值被装箱:这会导致一些GC开销。请注意,对于返回void或引用类型的方法,没有开销

我们将介绍一个新的API,它可以消除上面第一点和最后一点的开销。与此同时,除非您每秒进行数百万次调用,否则这些开销非常小,并且几乎总是被称为实际工作的实际托管方法相形见绌。

答案 1 :(得分:2)

个人资料,如果您需要或需要具体细节,因为这是您了解具体情况是否足够快的唯一方法......

话虽如此,

Mono原生API非常快。使用Mono的C API创建对象时,它在创建对象时与托管运行时基本相同。调用方法类似。

真正的开销来自于尝试来回传递和转换数据。只是创建一个对象并调用一个方法非常快 - 尝试通过多种类型转换数据稍微慢一点。但是,使用C API非常快,因此不太可能成为性能问题。 (当然,除非你是在一个非常紧密的循环中做这个,或类似的东西。在这种情况下,将你的循环重构为一个方法管理方,然后只调用一次。这就是将一个上下文切换到位。 )