我有一个应用程序,它可以读取文件并从中获取电子邮件。我使用线程运行我的应用程序,但我的应用程序在性能方面没有变得更好......我的问题是什么?
使用线程(需要54秒):
StreamReader sr = new StreamReader(@"D:\15.txt");
Regex regx = new Regex(@"([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))");
while (!sr.EndOfStream)
{
var line = sr.ReadLine();
Thread th = new Thread(new ThreadStart(() => {
var mc = regx.Matches(line);
if (mc.Count != 0)
foreach (Match item in mc)
{
Console.WriteLine(item.Value);
}
}));
th.Start();
}
普通代码(需要54秒):
StreamReader sr = new StreamReader(@"D:\15.txt");
Regex regx = new Regex(@"([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))");
while (!sr.EndOfStream)
{
var line = sr.ReadLine();
var mc = regx.Matches(line);
if (mc.Count != 0)
foreach (Match item in mc)
{
Console.WriteLine(item.Value);
}
}
答案 0 :(得分:0)
单独使用线程不会使您的应用程序更快。在这种情况下,在初始情况下,您有一个线程完成所有工作。在下一种情况下,你有第一个线程启动一个线程来完成工作。但是,您仍然只有一个线程处理,并且您的初始线程在等待处理准备就绪。如果你想让它更快,你需要找到你可以并行的部分。
答案 1 :(得分:0)
创建和启动线程是一项代价高昂的操作。每个RegEx有一个可能不符合成本效益。调用RegEx是便宜的,以保证额外的线程。
您的磁盘读取时间可能会花费更多时间,因此线程可能的任何好处都会消失。