在Mono - Linux上使用FileInfo和DirectoryInfo类

时间:2014-09-05 12:05:37

标签: c# .net linux mono

我在这里有两个小问题。

  1. 我正在处理我们想要执行的.net应用程序之一 在Linux上也是如此。我明显的选择是使用Mono运行它。这个 应用程序正在使用广泛的文件和目录枚举和 收集文件和目录信息。当我经历Mono Documentation时,我发现Mono设计了UnixDirectoryInfo, UnixFileInfo类分开。我的疑问是,这是否意味着 他们不支持FileInfo和DirectoryInfo 在BCL(System.IO名称空间)。

  2. 我知道.NET中的传统文件和目录枚举 很慢,我经历了许多人们推荐的文章 在Windows上使用与FindFirst(...)FindNext(...)的PInvoke调用。一世 我完全清楚这不适用于Linux。有没有人工作过 在这个领域专门在Mono Linux上测试File / Dir 枚举性能。

  3. 谢谢, Omky

2 个答案:

答案 0 :(得分:5)

从技术上讲,它在Linux机器上应该更快,因为文件系统枚举通常比Windows快。

但是我们想要根据自定义Mono.Posix评估Mono BCL,我检查了两个程序集的底层实现,虽然两者都会在最后调用系统函数,但路由不同,因为前者使用Mono运行时抽象,但后者使用direct p / invoke,所以我写了一个简单的代码来评估Directory和File枚举的性能差异,这里是:

    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 64位上使用Mono 3.2.8进行了测试

结果如下:

评估Mono Posix

抓取时间:469毫秒, 文件数:16020,目录数:2965


评估.Net Bcl

抓取时间:705毫秒, 文件数:16020,目录数:2965

基于我的实验,存在性能差异,因此根据您的要求,并考虑两个API之间的细微差别,编写一个瘦包装器以在两个操作系统上实现最佳结果可能不是一个坏主意 (我们可以在Windows上使用直接的Win32调用,因为.Net中的文件和目录IO的默认实现也很慢。)

答案 1 :(得分:2)

  

我发现Mono设计了UnixDirectoryInfo,UnixFileInfo类   分别。我的疑问是,这是否意味着他们不支持   FileInfo和DirectoryInfo是BCL中的(System.IO名称   空间)。

System.IO.FileInfo&amp;的支持 System.IO.DirectoryInfo以及Mono.Unix.FileInfo&amp; 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进行任何性能分析,但与直接系统调用相比,通常任何框架/库代码都会慢一点。但随着 框架/库,我们得到更好的错误处理,当然还有更便携的代码。

我的建议是,如果你打算编写一个便携式应用程序,你应该坚持使用框架(在这种情况下是Mono)。