如何才能将C#性能提升到实时
我需要通过C#计算大量的数据我在DB上有10000名患者,每个患者在DB上的记录平均有30次访问我需要检查他的组合他的访问我是通过LINQ完成的C#中的SQL组合并将其与其他患者进行比较,如果我发现其他4名患者具有相同的组合,我会认为它是安全的
我用它来循环代码,但需要时间,我需要提高性能
Parallel.For(0, 10000, (j,loopState) => { int id1 = getid(names[j].ToString(), 101); Parallel.For(0, 10000, (t,loopState1) => { generate_firstACV5A(id1, nvisit(id1), names[j].ToString()); int id2 = getid(names[t].ToString(), 10000); if (id1 == id2) { } else { generate_firstACV5B(id2, nvisit(id2), names[t].ToString()); } if (Enumerable.SequenceEqual(ACV5BFirst, ACV5Afirst) == true) { if (count == 0) { safecount++; if (safecount == 4) { ListViewItem it = new ListViewItem(getid(names[j].ToString(), 1000).ToString()); it.SubItems.Add(names[j].ToString()); listView3.Items.Add(it); loopState1.Break(); } } } });
当我将列表比较为真时,我遇到了一些运行错误
我感谢您的帮助
如果你的代码生成了至少几百个ListViewItems
,其中一个问题就是你在代码执行期间添加了ListViewItems
,这会触发ListView
重绘(与你拥有的所有其他计算相比速度很慢)。 首先将ListViewItems
放入List
,完成后将它们添加为数组,如下所示:
List list = new List (); Object myLock = new Object(); Parallel.For(0, 10000, (j,loopState) => { int id1 = getid(names[j].ToString(), 101); Parallel.For(0, 10000, (t,loopState1) => { generate_firstACV5A(id1, nvisit(id1), names[j].ToString()); int id2 = getid(names[t].ToString(), 10000); if (id1 == id2) { } else { generate_firstACV5B(id2, nvisit(id2), names[t].ToString()); } if (Enumerable.SequenceEqual(ACV5BFirst, ACV5Afirst) == true) { if (count == 0) { safecount++; if (safecount == 4) { ListViewItem it = new ListViewItem(getid(names[j].ToString(), 1000).ToString()); it.SubItems.Add(names[j].ToString()); lock (myLock ) { list.Add(it); } loopState1.Break(); } } } }); listView3.Items.AddRange(list.ToArray());
即使在Add期间锁定对列表的访问也会快得多,然后使用大约1000个项目重新绘制listView。 当我测试时,这种方法快了近10倍。