2014-02-15 32 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