【发布时间】:2013-10-15 06:20:11
【问题描述】:
我有一个应用程序需要在应用程序启动时读取非常大的.CSV 文件并将每一行转换为object。这些是读取文件的方法:
public List<Aobject> GetAobject()
{
List<Aobject> Aobjects = new List<Aobject>();
using (StreamReader sr = new StreamReader(pathA, Encoding.GetEncoding("Windows-1255")))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] spl = line.Split(',');
Aobject p = new Aobject { Aprop = spl[0].Trim(), Bprop = spl[1].Trim(), Cprop = spl[2].Trim() };
Aobjects.Add(p);
}
}
return Aobjects;
}
public List<Bobject> GetBobject()
{
List<Bobject> Bobjects = new List<Bobject>();
using (StreamReader sr =
new StreamReader(pathB, Encoding.GetEncoding("Windows-1255")))
{
//parts.Clear();
string line;
while ((line = sr.ReadLine()) != null)
{
string[] spl = line.Split(',');
Bobject p = new Bobject();
p.Cat = spl[0];
p.Name = spl[1];
p.Serial1 = spl[3].ToUpper().Contains("1");
if (spl[4].StartsWith("1"))
p.Technical = 1;
else if (spl[4].StartsWith("2"))
p.Technical = 2;
else
p.Technical = 0;
Bobjects.Add(p);
}
}
return Bobjects;
}
这阻止了我的UI 几秒钟,所以我试着让它成为multi-Threaded。但是我所有的测试都表明un-threaded 场景更快。这就是我测试它的方式:
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
Dal dal = new Dal();
Thread a = new Thread(() => { ThreadedAobjects = dal.GetAobject(); });
Thread b = new Thread(() => { ThreadedBobjects = dal.GetBobject(); });
a.Start();
b.Start();
b.Join();
a.Join();
}
sw.Stop();
txtThreaded.Text = sw.Elapsed.ToString();
Stopwatch sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < 1000; i++)
{
Dal dal2 = new Dal();
NonThreadedAobjects = dal2.GetAobject();
NonThreadedBobjects = dal2.GetBobject();
}
sw2.Stop();
txtUnThreaded.Text = sw2.Elapsed.ToString();
结果:
线程运行:00:01:55.1378686
非线程运行:00:01:37.1197840
为.Net4.0 编译,但也应在.Net3.5 下工作,处于发布模式。
有人可以解释一下为什么会发生这种情况,我该如何改进?
【问题讨论】:
-
创建线程需要时间。您总是创建一个新线程而不是重用现有线程(线程池)。
-
通常的线程答案适用;创建线程很昂贵。您可以尝试改用 ThreadPool。你也在做并行 IO 工作,检查你的硬盘请求队列长度,看看它们是否排队或缓存。您总是可以(前方有疯狂的想法!)使用 cpu 分析器来衡量什么是缓慢的。
-
另外,你的硬件是什么?这两个文件是在相同的驱动器上还是不同的驱动器上?你有一个或几个cpu核心吗?目标是使其加载更快,还是确保 ui 不会锁定?
-
您每次运行都测量了什么?挂钟时间? CPU 时间?
标签: c# multithreading performance