8

我有一个在我的 Windows 开发机器上运行良好的 ASP.NET 应用程序。虽然服务器是运行 Mono 的 Linux,但一旦上传相同的代码,其运行速度比在 Windows 机器上慢 4 或 5 倍(例如,一项任务需要 25 秒与 5 秒)。

这种性能是 Mono 的一个已知问题吗?我能做些什么吗?代码主要是文本处理、字符串替换、正则表达式等,如果这有什么不同的话。我已经在本地使用 VS 分析和调试了我的代码,但我不知道是否可以使用 Mono 在服务器上进行远程调试,或者我接下来需要做什么才能真正修复它。

4

5 回答 5

6

对于 Mono 来说,正则表达式是一个特别薄弱的领域。Mono 的 Regex 类始终使用解释代码,而 .Net 可以将其转换为编译后的 IL,从而加快执行速度。

大多数其他形式的文本处理(如替换)应该大致相似。

于 2011-01-21T05:38:48.777 回答
4

安装 Mono,最好在类似于您的服务器的 Linux 系统上。在 Mono 上分析您的代码并查看瓶颈在哪里。

我有一个在遵循 Apache 日志文件的 Linux 服务器上运行的 Mono 应用程序。我在 Windows 上开发它,在 Linux 上测试它时,我发现它在 Mono 2.4 上比 .NET 3.5 慢 8-10 倍。它的大部分时间都花在 Regex.Match 和字符串函数上。只需在对 string.EndsWith() 的 4 次调用中指定 StringComparison.Ordinal,我就能将 Mono 程序的整体速度提高一倍。如果您想要序号字符串比较,那可能会提高您的速度。

即使使用 StringComparison.Ordinal,string.StartsWith() 仍然很慢。通过编写我自己的 string.StartsWith() 版本,我的整体程序速度提高了 25% 。

因此,如果您的应用需要进行序数比较,请尝试指定 StringComparison.Ordinal 或编写您自己的字符串函数。

于 2011-01-22T22:23:09.687 回答
1

您是在使用 StringBuilder 对象,还是在进行字符串连接。如果你正在做大量的字符串工作,你会遇到一些性能错误。

但我认为 leppie 已经做到了,微软花了很多钱测试并将 ASP.net 集成到 IIS 中,所以它真的非常快。如果您不想为 MS 盒子付费,那么您将不得不面对这样一个事实:Mono 是开源的,而 IIS 是经过测试的商业产品。

一个很好的例子就是这里,微软实际上用一个与 IIS 服务器一起工作的内核模式库修改了 Windows 本身。正确使用缓存的正确架构应用程序可以在以下代码中获得非常好的性能提升:HTTP.sys

于 2011-01-21T05:33:55.347 回答
1

您为此使用 mod_mono 或 mod_proxy 吗?虽然从 Mono 中获得的东西有一些限制,但使用 mod_mono 的一般延迟也会比 mod_proxy 少。

请参阅Mono ASP.NET 常见问题解答中的“mod_mono 和 mod_proxy”部分

于 2011-01-21T05:37:49.930 回答
1

根据这项学术研究,由于某些 Linux 系统“更快地倾向于进入硬盘缓存/交换空间”[与 Windows 相比],某些 Linux 发行版中的 Mono 性能可能会受到阻碍。

“请注意即使使用本机代码,两个操作系统也存在巨大差异。在数组中的 131072 个整数处,Fedora Core 4 Test 3 操作系统的运行速度比 Windows 中完全相同的代码慢 3 倍以上。”

由于 Linux 发行版内核调度配置各不相同,因此了解您在 Linux 服务器上运行的操作系统发行版和版本以及您的应用程序可用的内存和 CPU 周期会很有用。

于 2011-01-21T05:51:29.030 回答