为什么MVC中的异步性能比其他方法差

时间:2018-09-22 12:54:14

标签: c# performance asynchronous model-view-controller

我知道我一无所知... 我正在研究各种并行程序编程方法的性能。 并在测试期间产生了一些有争议的结果。我想澄清一下这件事。 我有3种方法可以同时读取和处理多个文件。

  1. 经典顺序(假设最简单但性能较差)
  2. 经典线程(此任务并非最佳选择,因为使用 I / O,但不是处理器)
  3. 新的 asyncronius (最好用于此任务,因为使用I / O)

我对3个案例进行了100次5次并发线程延长超时100秒的测试

ab -n 100 -c 5 -s 100

结果:最小值,平均值和最大值

  1. 3730 8653 14565(最佳表现)
  2. 5090 7627 13888
  3. 12985 47973 71764(最差表现)

怎么回事,针对这种情况的最佳方法却显示出最差的结果?

请参见下面的代码,它从内存中的文件夹读取文件,并以此方式计算其总长度。

1个顺序

        int directorySize = 0;string fileNames = "";
        foreach (var fileName in Directory.GetFiles(@"f:\Old\My Images\"))
        {
            StreamReader sw = new StreamReader(fileName);
            string res = sw.ReadToEnd();
            directorySize += res.Length;
            fileNames += fileName + "<br/>";
        }
        ViewData["Message"] = directorySize +" "+ fileNames;

2个线程

int directorySize = 0;string fileNames = "";
        List<Task<string>> lst = new List<Task<string>>();
        foreach (var fileName in Directory.GetFiles(@"f:\Old\My Images\"))
        {
            lst.Add(Task.Factory.StartNew(() =>{
                StreamReader sw = new StreamReader(fileName);
                return sw.ReadToEnd();
            }));
            fileNames += fileName + "<br/>";
        }

        while (lst.Count > 0)
        {
            var res = await Task.WhenAny(lst); lst.Remove(res);
            directorySize += res.Result.Length;
        }

        ViewData["Message"] = directorySize + " " + fileNames;

3异步

int directorySize = 0;string fileNames = "";
        List<Task<string>> lst = new List<Task<string>>();
        foreach (var fileName in Directory.GetFiles(@"f:\Old\My Images\"))
        {
            StreamReader sw = new StreamReader(fileName);
            lst.Add(sw.ReadToEndAsync());
            fileNames += fileName + "<br/>";
        }

        while(lst.Count>0)
        {
            var res = await Task.WhenAny(lst);lst.Remove(res);
            directorySize += (await res).Length;
        }

        ViewData["Message"] = directorySize + " " + fileNames;

0 个答案:

没有答案