7

我有一个关于 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。对此有何建议?

4

2 回答 2

3

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

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

  1. 使用不同的工具包(GTK#、WX.Net 等)。
  2. Cocoa Library使用 XCode 和PInvokeC#构建一个DLL。

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

于 2013-04-03T20:43:25.287 回答
1

您将不得不在 Mac 或 Linux 上进行调试,以找出究竟是什么运行得如此糟糕。Mono 有一些非常慢的实现。虽然您看到 UI 缓慢的症状,但原因可能完全是另外一回事。

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

于 2013-04-03T19:53:19.390 回答