簡體   English   中英

C#Performance MS verse Mono Problems

[英]C# Performance MS verse Mono Problems

我正在開展一個相當簡單的(學校)項目。 這是一個工作車間調度員。 它是單線程的,它具有非常有限的文件I / O(它讀取一個小問題描述,然后它開始嘗試構建解決方案)。 CPU應該是瓶頸。 沒有用戶輸入/ GUI。

在我的機器上,在發布模式下,沒有調試器 - 在3分鍾的CPU時間內,我的PC可以針對特定問題生成/評估20,000個不同的計划。

在類似的* nix機器上,使用單聲道執行,在3分鍾的CPU時間內,服務器設法生成/評估2,000個不同的時間表。 它是速度的十分之一 我比較了我的機器和這個特定服務器之間的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 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 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)

這是一個尷尬的答案,但我覺得這是最公平的處理方式......我無法解釋原因是什么,但我不想暗示單聲道非常緩慢(它真的不是)。

我擔心的是讓程序在服務器上快速運行。 正如其他人所指出的那樣,服務器上安裝的單聲道版本非常老舊。 我希望沒有人看到我的問題,並認為它反映了當前的單聲道狀態。 遺憾的是,我無法在服務器上更新mono版本。

所以,我重新編寫了我的代碼來刪除不必要的計算,避免使用迭代器,並限制內存分配。 我的原始代碼正在做很多不必要的對象創建,並且對象比他們需要的要大得多。 清理工作使我的機器速度提高了一倍,並使“服務器”性能達到了我自己的70%(這是一個巨大的改進!)。

盡管如此,比較不同的硬件是不公平的 - 即使以前的Python程序“似乎”以大致相同的速度運行。 我安裝了Linux,安裝了最新版本的mono,我修改后的程序運行在Windows版本的96%。

我沒有繼續挖掘那個。 在相同的硬件上使用當前版本的mono,給了我幾乎相同的性能。 感謝所有的建議,這是非常有幫助的,並節省了我很多時間。

可能是內存泄漏。 Mono正在進行艱苦的戰斗; 微軟制造了一個系統,開發人員必須對其中的大部分進行逆向工程。 如果你真的無法搞清楚,我會嘗試向單聲道開發人員報告錯誤:

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

確保您的單聲道版本是最新的; 2.10很古老。 截至目前,3.2.6是最新的。 來自軟件包維護者的打包版本可能不夠好; 嘗試從源代碼tarball構建它,並在報告錯誤之前使用它來運行程序。

如果您在linux上使用wine-mono或類似的東西,那么請確保wine和wine-mono也是最新的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM