【问题标题】:Mono C# WinForms -> Serious performance problems when running on Mac OSXMono C# WinForms -> 在 Mac OSX 上运行时出现严重的性能问题
【发布时间】:2013-04-03 18:15:44
【问题描述】:

我有一个关于 C#、Mono 和 OSX 的问题。我已经使用 Windows 窗体在 C# 中创建了一个程序,并试图使其在 Mac 上可用。

问题是,OSX 上的性能极差,我只是找不到加速它的方法。程序本身实际上非常简单:一个客户端服务器系统只使用两个 DataGridView、几个 ComboBox 和 Button、一个 TabControl、几个 SplitContainer——就是这样!在 Windows 上运行良好,没有任何速度问题。

当我在 Mac(MacBook Air,OSX 版本 10.8.3)上打开程序时,加载 GUI 需要很长时间。在 Windows 上构建它大约需要 0.5 秒,在 Mac 上大约需要一分钟(!)。所有控件的构建速度都非常慢,并且大多数情况下,当通过单击某个东西与程序交互时,它需要另外至少 10 秒的响应时间。

我了解到 Mono 使用 Windows.System.Drawing 本地构建 GUI。这是程序响应极慢的可能原因吗?我可以做些什么来加快程序?必须有某种方法,因为如果 Mono 甚至不能用于这样一个简单的程序,那它就毫无用处了……

我花了好几个小时试图用谷歌搜索我的问题的答案,但找不到任何有用的东西:AheadOfTime-Compiling、LLVM - 没有什么能提高性能。

非常感谢您提前回答!

克里斯

更新: 我现在稍微减少了性能问题。 Mono 似乎对 Gridviews 的 CellFormating 有问题。我更改了适用部分的代码,现在它运行得更快了。

尽管如此,构建 GUI 仍然需要很长时间。您可以从字面上看它构建 GUI。对此有何建议?

【问题讨论】:

  • 您是否使用 XML 来传输数据?

标签: c# winforms performance macos mono


【解决方案1】:

加载时间很可能是 JIT 第一次编译您的代码(我的程序集也需要大约 30-60 秒才能首次启动);第二次运行你的程序应该加载得更快。在 Windows 上,Visual Studio 将 AOT 您的程序集作为编译的一部分,因此第一次启动很快。我相信缓慢的控制性能是由于字体渲染(它甚至不是好看的渲染)。最重要的是,keyboard handling is wrongly implemented 和 Mountain Lion,您还需要用户下载 XQuartz。

Mono 很有用,但它的 WinForms 实现不是。如果 OS X 支持对您很重要,您的选择如下:

  1. 使用不同的工具包(GTK#、WX.Net 等)。
  2. 使用 XCode 构建 Cocoa Library DLL,并从 C# 构建 PInvoke

最安全的选择是后者,但如果您的需求很简单,使用不同的工具包可能会更容易。

【讨论】:

  • Visual Studio 没有 AOT 编译器或与 mscorsvw 交互。你的来源是什么?
  • @Dai 我相信它在 Visual Studio 中编译时会调用 NGen(或类似的),但我会在稍后回家时尝试找到您的博客文章。
  • @Mr.Smith 感谢您的回答。由于程序不是那么大,我可能会使用不同的工具包。您对您建议的工具包有任何经验吗?如果我交换工具包并遇到与现在相同的速度问题,那就太烦人了:-)
  • @Mr.Smith 多次运行我的程序并不能解决速度问题。你是对的:字体渲染不是很好,但这真的是控制缓慢的原因吗?我怀疑它可能是 Mono 通过 Windows.System.Drawing 重绘所有 WinForms,因为构建每个表单需要很长时间。我似乎不是唯一一个使用 WinForms 性能缓慢的人,但在其他情况下,它似乎可以完成这项工作。有什么我可以解决的问题吗?我提到的问题是基于已经安装的 XQuartz。
  • 还有可能使用 MonoMac,它是 Cocoa API 的 C# 绑定(比必须自己编写更好)。
【解决方案2】:

您必须在 Mac 或 Linux 上进行调试才能找到运行如此糟糕的确切原因。 Mono 有一些非常慢的实现。虽然您看到 UI 缓慢的症状,但原因可能完全是另外一回事。

例如,在类似的情况下,我发现 XmlDocument 非常慢,因为我正在研究 UI 为何如此缓慢。如果您使用 XmlDocument 来存储来自服务器的数据,它可能会导致您的 UI 变慢并且几乎没有响应。

【讨论】:

  • 感谢您的回答。我正在使用 XmlDocument 从 xml 文件中读取服务器地址。因为我只是在阅读一个不可能真正成为问题的 IP 地址 - 或者可以吗?我将硬编码服务器地址,重新编译以测试并在此处发布结果。这可能需要几天时间,因为我目前正在解决其他问题。另外,如果我想在mac上调试用Visual Studio开发的程序,我需要什么?
  • MonoDevelop 是免费的,并且有一个标准的 Mac 安装程序。
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 2015-12-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2011-06-08
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多