我正在开展一个相当简单的(学校)项目。这是一个工作车间调度员。它是单线程的,它具有非常有限的文件I / O(它读取一个小问题描述,然后它开始尝试构建解决方案)。 CPU应该是瓶颈。没有用户输入/ GUI。
在我的机器上,在发布模式下,没有调试器 - 在3分钟的CPU时间内,我的电脑可以针对特定问题生成/评估20,000个不同的时间表。
在类似的* nix机器上,使用mono执行,在3分钟的CPU时间内,服务器设法生成/评估2,000个不同的时间表。 速度的1/10 。我比较了我的机器和这个特定服务器之间的Python性能,吞吐量几乎相同。
我可以看到唯一的“系统”调用是对
的调用Process.GetCurrentProcess().TotalProcessorTime.Minutes
但删除它没有任何影响。
我尝试过使用
- aot -O = all
它没有任何明显的影响。
我也尝试对它运行单声道探查器,但结果并没有像我希望的那样有用。
Hits % Method name
57542 37.45 /usr/bin/mono
11432 7.44 __lll_unlock_wake in /lib64/libpthread.so.0
6898 4.49 System.Linq.Enumerable:Any<jobshop2.JobTask> (System.Collections.Generic.IEnumerable`1<jobshop2.JobTask>,System.Func`2<jobshop2.JobTask, bool>)
6857 4.46 System.Collections.Generic.List`1/Enumerator<jobshop2.JobTask>:MoveNext ()
3582 2.33 pthread_cond_wait@@GLIBC_2.3.2 in /lib64/libpthread.so.0
2719 1.77 __lll_lock_wait in /lib64/libpthread.so.0
在前六行中 - 我只承认其中两个是我的代码,我可以改进。在完整输出中,我可以在/lib64/libpthread.so.0中看到很多调用,它们似乎处理锁定,解锁,等待,互斥和pthread。我对此感到困惑,因为它不是一个多线程的应用程序。
我正在浏览单声道网站上的“性能”页面,但没有什么能像我一样突然出现问题。我毫不怀疑我的代码是丑陋而缓慢的,但我真的没想到会有如此大的性能下降。我目前正在尝试在我的桌面上安装Linux,以便我可以在同一硬件上以单声道运行我的应用程序以帮助消除该变量 - 但我认为有人可能会提供一些建议/见解。
编辑: 它是版本2.10.8 mono
Mono JIT compiler version 2.10.8 (tarball Sat Feb 16 11:51:56 UTC 2013)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: altstack
Notifications: epoll
Architecture: amd64
Disabled: none
Misc: debugger softdebug
LLVM: supported, not enabled.
GC: Included Boehm (with typed GC and Parallel Mark)
答案 0 :(得分:5)
这是一个尴尬的答案,但我觉得这是最公平的处理方法......我无法解释原因是什么,但我不想暗示单声道是非常慢(实际上并非如此)。
我担心的是让程序在服务器上快速运行。正如其他人所指出的那样,服务器上安装的单声道版本非常老旧。我希望没有人看到我的问题,并认为它反映了当前的单声道状态。遗憾的是,我无法更新服务器上的mono版本。
因此,我重新编写了代码以删除不必要的计算,避免使用迭代器,并限制内存分配。我的原始代码正在做很多不必要的对象创建,并且对象比他们需要的要大得多。清理工作使我的机器上的速度提高了一倍,并使“服务器”性能达到了我自己的70%(巨大的改进!)。
但是,比较不同的硬件是不公平的 - 即使以前的Python程序“似乎”以大致相同的速度运行。我安装了Linux,安装了最新版本的mono,我修改后的程序运行在Windows版本的96%。
我没有继续挖掘。在相同的硬件上使用当前版本的mono,给了我几乎相同的性能。感谢所有的建议,它非常有用,为我节省了很多时间。
答案 1 :(得分:2)
可能是内存泄漏。 Mono正在进行艰苦的战斗;微软制造了一个系统,开发人员必须对其中的大部分进行逆向工程。如果你真的无法弄清楚,我会尝试向单声道开发人员报告错误:
Bugs - Mono (http://www.mono-project.com/Bugs)
确保您的单声道版本是最新的; 2.10很古老。截至目前,3.2.6是最新的。来自软件包维护者的打包版本可能不够好;尝试从the source tarball构建它,并在报告错误之前使用它来运行程序。
如果您在linux上使用wine-mono或类似的东西,那么请确保wine和wine-mono也是最新的。