Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Mono和WebRequest速度-测试_C#_Linux_Mono_Httpwebrequest - Fatal编程技术网

C# Mono和WebRequest速度-测试

C# Mono和WebRequest速度-测试,c#,linux,mono,httpwebrequest,C#,Linux,Mono,Httpwebrequest,在mono 4.6.2/linux中,我注意到wget下载文件的速度与webclient.DownloadString之间存在巨大差异,所以我做了一个小测试来研究。为什么wget比C#快得多?根据我自己的实验,比起简单地使用.DownloadString,使用wget下载、手动读取文件并最终删除下载文件的开销要快得多。我是否错误地使用了HttpWebRequest 更新:在mono/linux上,使用AutomaticDecompression似乎没有任何区别。不过,我看不到mono中报告的任何

在mono 4.6.2/linux中,我注意到wget下载文件的速度与webclient.DownloadString之间存在巨大差异,所以我做了一个小测试来研究。为什么wget比C#快得多?根据我自己的实验,比起简单地使用
.DownloadString
,使用wget下载、手动读取文件并最终删除下载文件的开销要快得多。我是否错误地使用了
HttpWebRequest

更新:在mono/linux上,使用
AutomaticDecompression
似乎没有任何区别。不过,我看不到mono中报告的任何问题

更新2:由于输入错误,我没有注意到本机WebClient类比简单的扩展类快得多。为什么mono在一个简单的扩展类和它的父类之间有巨大的性能差距

class WC1 : System.Net.WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var r = (HttpWebRequest) base.GetWebRequest(address);
        r.Pipelined = true;
        r.KeepAlive = true;
        r.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

        return r;
    }
}

class WC2 : System.Net.WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var r = (HttpWebRequest)base.GetWebRequest(address);
        r.Pipelined = true;
        r.KeepAlive = false;
        r.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

        return r;
    }
}

class WC3 : System.Net.WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var r = (HttpWebRequest)base.GetWebRequest(address);
        r.Pipelined = false;
        r.KeepAlive = true;
        r.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

        return r;
    }
}

class WC4 : System.Net.WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var r = (HttpWebRequest)base.GetWebRequest(address);
        r.Pipelined = false;
        r.KeepAlive = false;
        r.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

        return r;
    }
}

class Program
{
    static List<string> CreateUrls(int c)
    {
        var urls = new List<string>();
        for (var i = 0; i < c; i++)
        {
            urls.Add("http://foo.com/?" + i);
        }
        return urls;
    }

    static TimeSpan Test(WebClient wc, IEnumerable<string> urls)
    {
        var sw = new System.Diagnostics.Stopwatch();

        sw.Start();

        foreach (var u in urls)
        {
            wc.DownloadString(u);
            Console.Write(".");
        }

        sw.Stop();
        return sw.Elapsed;
    }

    static void Main(string[] args)
    {
        var urlsPerTest = 200;
        var urls = CreateUrls(urlsPerTest * 6);


        var wc1 = new WC1();
        var urls1 = urls.Take(urlsPerTest);
        var elapsed1 = Test(wc1, urls1);
        Console.WriteLine("WC1:" + elapsed1);

        var wc2 = new WC2();
        var urls2 = urls.Skip(urlsPerTest * 1).Take(urlsPerTest);
        var elapsed2 = Test(wc2, urls2);
        Console.WriteLine("WC2:" + elapsed2);

        var wc3 = new WC3();
        var urls3 = urls.Skip(urlsPerTest * 2).Take(urlsPerTest);
        var elapsed3 = Test(wc3, urls3);
        Console.WriteLine("WC3:" + elapsed3);

        var wc4 = new WC4();
        var urls4 = urls.Skip(urlsPerTest * 3).Take(urlsPerTest);
        var elapsed4 = Test(wc4, urls4);
        Console.WriteLine("WC4:" + elapsed4);

        var wc5 = new WebClient();
        var urls5 = urls.Skip(urlsPerTest * 4).Take(urlsPerTest);
        var elapsed5 = Test(wc5, urls5);
        Console.WriteLine("Webclient:" + elapsed5);


        var urls6 = urls.Skip(urlsPerTest * 5).Take(urlsPerTest);
        File.WriteAllLines("/tmp/foo.txt", urls6);

        var sw = new Stopwatch();
        sw.Start();
        var p = new Process();
        p.StartInfo = new ProcessStartInfo();
        p.StartInfo.Arguments = "--silent -i /tmp/foo.txt";
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.FileName = "wget";
        p.StartInfo.WorkingDirectory = "/tmp";
        p.StartInfo.UseShellExecute = false;
        p.Start();
        p.WaitForExit();

        sw.Stop();
        File.Delete("/tmp/foo.txt");

        Console.WriteLine("Wget:" + sw.Elapsed);

        Console.ReadLine();
    }
}

请说明所使用的mono版本,如果您使用的是
--server
标志,请尝试一下,并告诉我们没有区别
WC1:00:01:20.6518416
WC2:00:01:16.3561090
WC3:00:01:18.4278756
WC4:00:01:25.5372973
Webclient:00:01:04.6749124
Wget:00:01:03.4862053