2

我现在明白 WinRT 是基于多个实现(例如 Win32)的 API,但由于 COM 和新的 ECMA 335/CLI 元数据,它以“面向对象”的方式提供。(请参阅Windows 8 运行时(WinRT/Windows 应用商店应用程序/Windows 10 通用应用程序)与 Silverlight 和 WPF 相比如何?

作为 .Net 开发人员,由于性能不佳,我总是学会尽可能避免 P/Invoke、COM 或每个“外部/互操作”调用。(如果我们可以为本地库调用使用 C++/CLI 包装器,那就更好了)

  • COM WinRT API 的性能是否比传统 COM 更好?
  • 如果是这样,是由于 ECMA 335 元数据还是新的实现?
  • 我们有什么“隐藏”?
4

2 回答 2

3

COM(或 WinRT,基本上是 COM)的性能问题将归结为异常“健谈”(即在很短的时间内进行大量调用)或数据编组。

如果您一直调用它,任何需要少量时间的方法调用都会损害性能。因此,我假设 WinRT 调用不如在同一个 .NET 程序集中从一种方法调用另一种方法快(我假设 JIT 会将其优化掉或将其优化为微不足道)。如果无法进行相同级别的优化,那么您会注意到方法调用 - 如果您过度使用它。例如,人们过去常说 C++ 中的虚方法调用会损害性能,仅仅是因为它们需要一个无法像普通函数调用那样优化的 vtable 间接。

虽然最大的性能损失是数据,但调用外部系统通常需要将您的数据转换为其他系统可以理解的格式 - 这比您意识到的更大的性能损失。即使您不必编组它,您也经常需要复制数据 - 因此,您必须复制整个数据,而不是传递 4 个字节的引用指针,或者将其固定,以便仍然可以从其他系统访问它在您的呼叫环境之外。这可能会以较小的方式损害性能,但仍然不如直接调用快。

我想说在这两种情况下,调用 WinRT 方法不会对你造成太大伤害,.NET 和 WinRT 之间有一层(类似于旧的自动生成的 COM 包装器),但显然要轻得多。

于 2012-08-21T21:16:34.830 回答
1
  • COM WinRT API 的性能是否比传统 COM 更好?

WinRT 对象并没有什么神奇之处可以让它比等效的传统 COM 对象执行得更快。他们都是COM。不过,更快的是上市时间——WinRT 作为开发人员更容易处理。

  • 我们有什么“隐藏”?

你已经自己回答了。

于 2012-08-21T21:04:56.723 回答