C#性能问题
我正在做一个相当直接的(学校)项目。这是一个作业车间调度程序。它是单线程的,具有非常有限的文件I/O(它读取一个小问题描述,然后尝试构建解决方案)。CPU应该是瓶颈。没有用户输入/GUI 在我的机器上,在发布模式下,没有调试器-在3分钟的CPU时间内,我的电脑可以为特定问题生成/评估20000个不同的计划 在类似的*nix机器上,使用mono执行,在3分钟的CPU时间内,服务器能够生成/评估2000个不同的计划这是速度的十分之一。我比较了我的机器和这个特定服务器之间的Python性能,吞吐量几乎相同 我认为唯一不同的“系统”调用是对C#性能问题,c#,.net,performance,mono,C#,.net,Performance,Mono,我正在做一个相当直接的(学校)项目。这是一个作业车间调度程序。它是单线程的,具有非常有限的文件I/O(它读取一个小问题描述,然后尝试构建解决方案)。CPU应该是瓶颈。没有用户输入/GUI 在我的机器上,在发布模式下,没有调试器-在3分钟的CPU时间内,我的电脑可以为特定问题生成/评估20000个不同的计划 在类似的*nix机器上,使用mono执行,在3分钟的CPU时间内,服务器能够生成/评估2000个不同的计划这是速度的十分之一。我比较了我的机器和这个特定服务器之间的Python性能,吞吐量几乎
Process.GetCurrentProcess().TotalProcessorTime.Minutes
但移除它并没有产生任何影响
我试过使用
--aot-O=全部
它没有任何明显的影响
我也试着运行mono profiler,但结果并没有我所希望的那么有用
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
可能是内存泄漏。莫诺正在进行一场艰苦的战斗;微软制造了一个系统,开发人员必须对大部分系统进行逆向工程。如果你真的不明白,我会尝试向mono开发者报告这个bug: 首先确保你的mono版本是最新的;2.10是古老的。到目前为止,3.2.6是最新版本。包维护人员提供的打包版本可能不够好;在报告bug之前,尝试从中构建它,并使用它运行程序
如果您在linux上使用wine mono或类似的东西,那么请确保wine和wine mono也是最新的。这是一个有点尴尬的答案,但我觉得这是最公平的处理方式……我无法真正解释原因,但我不想暗示mono的速度太慢(事实并非如此) 我关心的是让程序在服务器上快速运行。正如其他人所指出的,服务器上安装的mono版本非常旧。我希望没有人看到我的问题,认为它反映了当前的mono状态。遗憾的是,我无法在服务器上更新mono的版本 因此,我重新编写了代码,以删除不必要的计算,避免使用迭代器,并限制内存分配。我的原始代码对对象进行了大量不必要的创建,对象比需要的大得多。清理将我的机器速度提高了一倍,使“服务器”的性能达到我自己的70%左右(这是一个巨大的改进!) 然而,比较不同的硬件是不公平的——即使以前的Python程序“似乎”以大约相同的速度运行。我安装了Linux,安装了最新版本的mono,修改后的程序的运行速度是Windows版本的96%
我没有继续挖下去。在相同的硬件上使用当前版本的mono,给了我几乎相同的性能。感谢所有的建议,它非常有用,为我节省了很多时间。注意,
Minutes
为您提供了0到59分钟的时间。在那之后它被包裹。可能是一个与问题无关的bug。也许这可以让你对这个问题有更多的了解(间接)。mono的哪个版本?你试过完整的aot吗?也看看内存。上次我检查时,Mono的垃圾收集器没有微软的好。不必要的分配可能是问题所在。GC与代码并行运行,也许这解释了在libpthread中花费的时间?您是否在不同的硬件上进行测试?在你的问题中,comparable
是什么意思?此外,版本2.10
在这一点上已有多年的历史。为什么不使用较新的3.x
build?我经常注意到这种现象,尤其是在python中。很高兴它对你有用。优化代码确实是保证性能的最佳方法——可能不是在汇编级别,但仍然可以避免不必要的工作。
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)