從技術上講,它應該在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的默認實現也很慢)。
看看這裏;)https://github.com/mosa/Mono-Class-Libraries/blob/master/mcs/class/corlib/System.IO/FileInfo.cs – 2014-09-09 12:55:50
他們支持FileInfo和DirectoryInfo at至少在3.6(我相信它已經在那裏很長一段時間了)。它可以在內部重定向到UnixFile/DirInfo。我不確定。至於性能,我認爲它在Linux/Unix上運行速度非常快,因爲它們的文件系統本質上更快(由於我沒有數據支持它,因此有爭論,而且沒有科學準確性),但要查明,編寫一個測試用例並在你的發行版中運行它來測試你的用例。我沒有任何性能數據,但是當我使用它時,它並不明顯很慢。如果有的話,它看起來更快。 – kha 2014-09-12 08:09:41