2014-02-15 36 views
7

我正在研究一个相当直接的(学校)项目。这是一个作业车间调度程序。它是单线程的,它具有非常有限的文件I/O(它读取一个小问题描述,然后开始尝试构建解决方案)。 CPU应该是瓶颈。没有用户输入/ GUI。C#性能MS verse单声道问题

在我的机器上,在发布模式下,没有调试器 - 在3分钟的CPU时间内,我的电脑可以针对特定问题生成/评估20,000个不同的时间表。

在一台类似的* nix机器上,使用单声道在3分钟的CPU时间内执行,服务器设法生成/评估2,000个不同的时间表。 这是速度的1/10。我比较了我的机器和这台特定服务器的Python性能,吞吐量几乎相同。

唯一的“系统”打电话,我可以看到作为不同的是

Process.GetCurrentProcess().TotalProcessorTime.Minutes 

但是,消除它一直没有任何影响通话。

我已经尝试使用

--aot -O =所有

它没有任何明显的影响。

我也试过对它运行单声道轮廓仪,但结果没有像我所希望的那样有帮助。

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 [email protected]@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。我很困惑,因为它不是一个多线程应用程序。

我正在浏览mono网站上的Performance页面,但没有什么会真正跳出来作为一个问题。我毫不怀疑我的代码是丑陋而缓慢的,但我并不期待这样的性能下降。我目前正试图在我的桌面上安装Linux,以便我可以在同一硬件上以单声道运行我的应用程序,以帮助消除该变量 - 但我认为有人可能会提供一些建议/见解。

编辑: 它的版本是2.10.8单

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) 
+2

请注意,“分钟”会在0到59之间给出分钟数。之后它会进行换行。可能是一个与问题无关的bug。 – usr

+0

公平点usr - 但为我的目的,金额总是少于59。不过,我应该更好地检查。 –

+1

也许这[SO回答](http://stackoverflow.com/questions/1150002/how-is-the-current-performance-of-the-mono-virtual-machine?rq=1)可以给你更多的见解(间接)。 – pasty

回答

2

可能是内存泄漏。莫诺正在进行一场艰苦的战斗;微软制定了一个系统,开发人员不得不对其大部分进行反向工程。如果你真的无法弄清楚,我会尝试报告漏洞的单声道开发商:

Bugs - Mono (http://www.mono-project.com/Bugs)

确保您的单版本是最新的第一次; 2.10是古老的。截至目前,3.2.6是最新的。来自软件包维护人员的打包版本可能不够好;尝试从the source tarball开始构建,并在报告错误之前使用它来运行您的程序。

如果你在linux上使用wine-mono或类似的东西,那么确保wine和wine-mono是最新的。

5

这是一个尴尬的答案,但我觉得这是处理它的最公平的方式......我无法真正解释原因是什么,但我不想暗示单声道速度非常缓慢(实际上并非如此)。

我的担心是让程序在服务器上快速运行。正如其他人指出的那样,安装在服务器上的单声道版本非常陈旧。我希望没有人看到我的问题,并认为它反映了单声道的当前状态。可悲的是,我无法更新服务器上的单声道版本。

因此,我重新编写了我的代码来删除不必要的计算,避免使用迭代器,并限制内存分配。我原来的代码做了很多不必要的对象创建,对象比他们需要的大得多。清理工作使我的机器速度提高了一倍,并使服务器的性能达到了我自己的70%(一个巨大的改进!)。

尽管如此,比较不同的硬件是不公平的,即使之前的Python程序“似乎”以相同的速度运行。我安装了Linux,并且安装了最新版本的mono,我的修订版程序运行在Windows版本的96%。

我没有继续深入挖掘。在同一个硬件上使用当前版本的单声道,给了我几乎相同的性能。感谢所有的建议,这非常有帮助,并为我节省了很多时间。

+0

我经常注意到这个现象,尤其是python。很高兴它对你有效。优化代码确实是保证性能的最佳方式 - 可能不是汇编级别的,但仍可避免不必要的工作。 – Wyatt8740