我知道我一无所知... 我正在研究各种并行程序编程方法的性能。 并在测试期间产生了一些有争议的结果。我想澄清一下这件事。 我有3种方法可以同时读取和处理多个文件。
我对3个案例进行了100次5次并发线程延长超时100秒的测试
ab -n 100 -c 5 -s 100
结果:最小值,平均值和最大值
怎么回事,针对这种情况的最佳方法却显示出最差的结果?
请参见下面的代码,它从内存中的文件夹读取文件,并以此方式计算其总长度。
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;