我如何能够实时提高C#性能

时间:2012-11-29 01:19:14

标签: c# sql

我需要通过C#计算大量数据 我有10000名DB患者,每位患者在DB上的记录平均有30次访问 我需要检查他的组合是否通过C#中的LINQ SQL combinations进行了访问,并将其与其他患者进行比较 如果我发现另外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();
                         }


                       }
                    }
                });

当我将列表比较为真时,我遇到了一些运行错误

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

如果您的代码生成的ListViewItems至少有几百个,那么问题之一是您在代码执行期间添加了ListViewItems,这会触发ListView重绘(与你拥有的所有其他计算相比,这是缓慢的)。首先将ListViewItems放在List中,完成后,将它们添加为数组,如下所示:

List<ListViewItems> list = new List<ListViewItems>();
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倍。