有人知道 Mono 中原生 -> 托管上下文切换的开销吗?即使用 C API 调用 .NET 方法/创建 .NET 对象引起的开销。
问问题
709 次
2 回答
6
当前用于从 C 代码调用托管方法的 API 具有以下类型的开销:
- 它会执行一些锁定和哈希查找操作,以查看您正在调用的方法和合成的辅助方法是否已编译
- 如果方法尚未编译为本机代码,则它们将被编译
- 实际的方法调用很快,并且与某些答案中的推测相反,没有发生封送开销,因此不适用 blittable 类型和其他此类考虑
- 如果返回类型是值类型,则该值被装箱:这会导致一些 GC 开销。请注意,对于返回 void 或引用类型的方法,没有开销
我们将介绍一个新的 API,它消除了上面第一点和最后一点的开销。同时,除非您每秒执行数百万次调用,否则这些开销非常小,并且几乎总是与称为实际工作的实际托管方法相形见绌。
于 2009-08-18T06:41:07.627 回答
2
配置文件,如果您想要或需要具体细节,因为这是您知道您的具体情况是否足够快的唯一方法......
话虽如此,
Mono 原生 API 非常快。当您使用 Mono 的 C API 创建对象时,它在创建对象时所做的事情与托管运行时基本相同。调用方法是类似的。
真正的开销来自尝试来回传递和转换数据。仅仅创建一个对象并调用一个方法就非常快——尝试通过多种类型转换数据会稍微慢一些。但是,使用 C API 非常快,因此不太可能成为性能问题。(当然,除非您在一个非常紧凑的循环中执行此操作,或类似的情况。在这种情况下,将您的循环重构为托管端的方法,然后调用它一次。这会将单个上下文切换到位。 )
于 2009-08-18T00:25:48.060 回答