C#性能问题

C#性能问题,c#,.net,performance,mono,C#,.net,Performance,Mono,我正在做一个相当直接的(学校)项目。这是一个作业车间调度程序。它是单线程的,具有非常有限的文件I/O(它读取一个小问题描述,然后尝试构建解决方案)。CPU应该是瓶颈。没有用户输入/GUI 在我的机器上,在发布模式下,没有调试器-在3分钟的CPU时间内,我的电脑可以为特定问题生成/评估20000个不同的计划 在类似的*nix机器上,使用mono执行,在3分钟的CPU时间内,服务器能够生成/评估2000个不同的计划这是速度的十分之一。我比较了我的机器和这个特定服务器之间的Python性能,吞吐量几乎

我正在做一个相当直接的(学校)项目。这是一个作业车间调度程序。它是单线程的,具有非常有限的文件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)