2014-09-05 44 views
2

我在這裏有兩個小問題。Mono上的FileInfo和DirectoryInfo類的用法 - Linux

  1. 我的工作,我們要執行在Linux上 太.NET應用程序之一。我明顯的選擇是使用Mono來運行它。這 應用程序正在使用廣泛的文件和目錄枚舉和 收集文件和目錄信息。當我通過Mono Documentation時,發現Mono分別設計了UnixDirectoryInfo, UnixFileInfo類。我的查詢是,這是否表示 他們不支持BCL(System.IO名稱空間)中的 FileInfo和DirectoryInfo。

  2. 我知道,在.NET 傳統的文件和目錄的枚舉是緩慢的,我已經經歷了很多文章,人們推薦使用 用的PInvoke在Windows上使用FindFirst(...)FindNext中(...)調用了。我完全意識到這一點在Linux上不起作用。有沒有人專門在Mono Linux上工作 來測試File/Dir 枚舉的性能。

感謝, Omky

+0

看看這裏;)https://github.com/mosa/Mono-Class-Libraries/blob/master/mcs/class/corlib/System.IO/FileInfo.cs – 2014-09-09 12:55:50

+0

他們支持FileInfo和DirectoryInfo at至少在3.6(我相信它已經在那裏很長一段時間了)。它可以在內部重定向到UnixFile/DirInfo。我不確定。至於性能,我認爲它在Linux/Unix上運行速度非常快,因爲它們的文件系統本質上更快(由於我沒有數據支持它,因此有爭論,而且沒有科學準確性),但要查明,編寫一個測試用例並在你的發行版中運行它來測試你的用例。我沒有任何性能數據,但是當我使用它時,它並不明顯很慢。如果有的話,它看起來更快。 – kha 2014-09-12 08:09:41

回答

5

從技術上講,它應該在Linux機器上更快,因爲文件系統枚舉通常比Windows快。

但我們想要評估Mono BCL對Mono.Posix的自定義,我檢查了兩個程序集的底層實現,並且儘管兩者都會在最後調用系統函數,但由於前者使用Mono運行時抽象,但後者使用直接的p/Invoke,所以我寫了一個簡單的代碼來評估目錄和文件枚舉性能差異,那就是:

public static void Main (string[] args) 
    { 
     Assess ("/opt",5, false); 
     Console.WriteLine ("**********************"); 
     Assess ("/opt",5, true); 
    } 

    public static void Assess (string root,int iteration, bool net=true) 
    { 
     var watch = new Stopwatch(); 
     var fCount = 0; 
     var dCount = 0; 

     watch.Start(); 
     for (var i=0; i<iteration; i++) { 
      if (net) { 
       Console.WriteLine ("assessing .Net Bcl"); 
       var dirInfo = new System.IO.DirectoryInfo (root); 
       AssessNet (dirInfo, ref fCount, ref dCount); 
      } else { 
       Console.WriteLine ("assessing Mono Posix"); 
       var unixDirInfo = new Mono.Unix.UnixDirectoryInfo (root); 
       AssessMono (unixDirInfo, ref fCount, ref dCount); 
      } 
     } 
     watch.Stop(); 
     Console.WriteLine ("crawl time: {0} ms", watch.ElapsedMilliseconds); 
     Console.WriteLine ("files count: {0}, directory count: {1}", fCount, dCount); 
    } 

    public static void AssessNet (System.IO.DirectoryInfo root, ref int fCount, ref int dCount) 
    { 
     var files = root.GetFiles(); 
     var dirs = root.GetDirectories(); 

     foreach (var f in files) { 
      fCount++; 
     } 

     foreach (var d in dirs) { 
      dCount++; 
      AssessNet (d, ref fCount, ref dCount); 
     } 
    } 

    public static void AssessMono (Mono.Unix.UnixDirectoryInfo root,ref int fCount,ref int dCount) 
    { 
     var entries = root.GetFileSystemEntries(); 

     foreach (var e in entries) { 
      if (e.IsDirectory) { 
       dCount++; 
       AssessMono (e as Mono.Unix.UnixDirectoryInfo,ref fCount,ref dCount); 
      } else { 
       fCount++;`enter code here` 
      } 
     } 
    } 
} 

我在Ubuntu 14.04.1使用Mono 3.2.8測試的64位

結果如下:

評估單的Posix

抓取時間:469毫秒, 文件數:16020,目錄數:2965


評估.NET基礎類庫

抓取時間:705毫秒, 文件數:16020,目錄數:2965

根據我的實驗有一個執行因此,根據您的要求,並考慮到兩個API之間的細微差異,在操作系統 (我們可以在Windows上使用直接Win32調用作爲最佳結果編寫薄包裝器可能不是一個壞主意.Net中File和Directory IO的默認實現也很慢)。

+0

您的回答幫助我決定實施策略很多....非常感謝!!!!! – Omkar 2014-09-23 08:27:35

2

我發現,單聲道設計UnixDirectoryInfo,UnixFileInfo類 分開。我的查詢是,這是否意味着它們不支持它們在BCL(System.IO名稱 空間)中的 FileInfo和DirectoryInfo。

是支持System.IO.FileInfo & System.IO.DirectoryInfoMono.Unix.FileInfo & Mono.Unix.DirectoryInfo一起。因此,爲了編寫便攜式代碼,我們應該使用System.IO工具。下面的示例代碼已被寫入其採用System.IO

VERSIONINFO

MonoDevelop 3.1.0 
Installation UUID: e5e69249-f5d5-40a6-9424-2ecbdf6c71c7 
Runtime: 
    Mono 2.10.8.1 (Debian 2.10.8.1-1ubuntu2.2) (64-bit) 
    GTK 2.24.10 
    GTK# (2.12.0.0) 
Build information: 
    Git revision: unknown 
    Build date: 2012-08-15 10:45:07+0000 
Operating System: 
    Linux 
    Linux mantosh-Inspiron-3521 3.2.0-67-generiC#101-Ubuntu S 
    MP Tue Jul 15 17:46:11 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 

SampleProgram

using System; 
using System.IO; 

namespace Test 
{ 
    class DirInformation 
    { 
     static public void DoSomething() 
     { 
      string name = null; 
      name = "/home/mantosh/"; 
      DirectoryInfo info = new DirectoryInfo (name); 
      bool dirExists = info.Exists; 
      Console.WriteLine(dirExists); 
     } 

     public static void Main (string[] args) 
     { 
      DoSomething(); 
     } 
    } 
} 

我深知,這將不會工作在Linux上。有沒有人在Mono Linux上專門在這方面工作過 來測試File/Dir枚舉 的性能。

我認爲不是猜測,我們應該編寫示例應用程序並驗證性能。我還沒有對MONO進行任何性能分析,但通常任何框架/庫代碼都會比直接系統調用慢一點。但與 框架/庫,我們得到更好的錯誤處理,當然更便攜的代碼。

我的建議是,如果你的意圖是編寫一個可移植的應用程序,你應該堅持框架(在這種情況下是單聲道)。

相關問題