从技术上讲,它应该在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