首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#性能MS verse Mono问题

C#性能MS verse Mono问题
EN

Stack Overflow用户
提问于 2014-02-15 10:03:46
回答 2查看 2.7K关注 0票数 7

我正在做一个相当直截了当的(学校)项目.这是一个作业车间调度器。它是单线程的,它有非常有限的文件I/O (它读取一个小的问题描述,然后它开始工作,试图构建一个解决方案)。CPU应该是瓶颈。没有用户输入/GUI。

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

在一个类似的*nix机器上,用mono执行,在CPU时间的3分钟内,服务器成功地生成/评估了2,000个不同的时间表。,是的十分之一。我比较了我的机器和这个特定服务器之间的Python性能,并且吞吐量几乎是相同的。

我能看到的唯一的“系统”呼叫是呼叫。

代码语言:javascript
复制
Process.GetCurrentProcess().TotalProcessorTime.Minutes

但是移除它并没有产生任何影响。

我试过用

-aot -O=all

它没有产生任何明显的影响。

我也尝试过针对它运行mono分析器,但是结果并没有我所希望的那么有帮助。

代码语言:javascript
复制
  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 64/libpthread.so.0中有相当多的调用,这些调用似乎处理锁定、解锁、等待、互斥和线程。我对此感到困惑,因为它不是多线程应用程序。

我正在浏览mono站点上的性能页面,但是没有什么是真正跳出我的问题的。我毫不怀疑我的代码是丑陋和缓慢的,但我真的没想到会有这么大的性能下降。我目前正尝试在我的桌面上安装Linux,这样我就可以在相同的硬件上以单一的方式运行我的应用程序,以帮助消除这个变量--但我认为可能有人会提供一些建议/洞察力。

编辑:它是2.10.8mono版

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 16:39:08

可能是记忆泄露。Mono正在进行一场艰难的战斗;微软制造了一个系统,开发人员不得不对其中的大部分进行逆向工程。如果您真的搞不懂,我会尝试向mono开发人员报告这个bug:

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

确保您的单一版本首先是最新的;2.10是古老的。截至目前,最新版本为3.2.6。包维护人员的打包版本可能不够好;在报告bug之前,尝试从源tarball构建它,并使用它来运行您的程序。

如果您在linux上使用葡萄酒-mono或类似的东西,那么请确保葡萄酒和葡萄酒-mono也是最新的。

票数 2
EN

Stack Overflow用户

发布于 2014-03-23 15:15:47

这是一个有点尴尬的回答,但我觉得这是处理它的最公平的方法.我不能真正解释原因,但我不想暗示mono是可怕的慢(它真的不是)。

我担心的是让程序在服务器上快速运行。正如其他人所指出的,安装在服务器上的mono版本非常古老。我希望没有人看到我的问题,认为它反映了目前的单一状态。遗憾的是,我无法在服务器上更新mono的版本。

因此,我重写了我的代码,以消除不必要的计算,避免使用迭代器,并限制内存分配。我的原始代码做了很多不必要的对象创建,对象比需要的要大得多。清理工作使我的机器上的速度翻了一番,使“服务器”性能提高了70% (这是一个巨大的改进!)

不过,比较不同的硬件是不公平的--即使以前的Python程序“似乎”以大约相同的速度运行。我安装了Linux,安装了最新版本的mono,修改后的程序运行在Windows版本的96%。

在那之后我没有继续挖下去。在相同的硬件上使用当前版本的mono,给了我几乎相同的性能。谢谢所有的建议,这是难以置信的帮助,并为我节省了很多时间。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21796058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档