只有100条数据老超时怎么优化,求方案

shsyzl007 2016-06-28 05:59:11
数据表数据很少不超过100条但不停的在变,分析一条里面的数据耗时不到1秒。
我现在不断遍历进行分析
while (true)
{
DateTime date1 = DateTime.Now;
DataView dv = db.ExecuteDataView(sql);//数据不超过100条,但不停的在变
for (int i = 0; i < dv.Table.Rows.Count; i++)
{
xx(dv[i][0]);//分析数据;
}
double tt = (DateTime.Now - date1).TotalMilliseconds;
if (tt > 3000) {超过3秒发信息警告分析太慢了}
}

现在老是收到分析超时的信息。怎么弄才能提高效率?
有人说用异步或多线程。异步,xx分析函数我放到一个委托里面也会出现超时但比直接遍历好很多。多线程基本没法用,遍历时把xx函数放到线程里不久就会内存泄漏。怎么才能提高效率,在不存在内存泄漏的情况下把CPU打上去,让其分析的更快。。
...全文
206 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
南天空 2016-06-29
  • 打赏
  • 举报
回复
数据不多,但是程序很慢,那么问题基本上就存在于你的数据库查询操作太多,数据的分析和计算是很快的,你不能每次都去数据库查询数据,再去计算。思路是尽可能的减少数据库查询操作。 如果换种办法的话我建议这样,你采用WPF中数据绑定的思想,DataView绑定一个查询的数据源,实现INotifyPropertyChanged接口,数据源变化时DataView的数据会跟着变化,你直接操作DataView中的数据,这样会比较快。
大雨将至 2016-06-28
  • 打赏
  • 举报
回复
写了个监控线程完成的小程序,贴给你

class CountDownLatch
    {
        private object lockObj = new Object();
        private int counts;

        public CountDownLatch(int counts)
        {
            this.counts = counts;
        }

        public void Await()
        {
            lock (lockObj)
            {
                while (counts > 0)
                {
                    Monitor.Wait(lockObj);
                }
            }
        }

        public void CountDown()
        {
            lock (lockObj)
            {
                counts--;
                Monitor.PulseAll(lockObj);
            }
        }
    }

class Tasks
    {
        private CountDownLatch latch;
        private Object data;

        public Tasks(CountDownLatch latch, Object data)
        {
            this.latch = latch;
            this.data = data;
        }

        public void Analysis(object o)
        {
            //分析data
            System.Threading.Thread.Sleep(new Random().Next(3) * 1000);
            this.latch.CountDown();
        }
    }

CountDownLatch latch = new CountDownLatch(100);
            for (int i = 0; i < 100; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(new Tasks(latch, new object()).Analysis), latch);
            }
            latch.Await();
            //全部线程执行完成, 继续
xuzuning 2016-06-28
  • 打赏
  • 举报
回复
分析一条里面的数据耗时不到1秒(0.9秒是不到1秒吧?) 那么分析 100 条数据耗时不到 100 秒(8、9十秒也是正常的) 那么你 if (tt > 3000) {超过3秒发信息警告分析太慢了} 显然是太苛刻了 提高效率的手段是优化 xx 中的算法 优化后仍不能满足要求,则可使用并行处理 for (int i = 0; i < dv.Table.Rows.Count; i++) .... 改成 Parallel.ForEach(Partitioner.Create(0, dv.Table.Rows.Count), (W) => { for (int i = W.Item1; i < W.Item2; i++) .... });
shsyzl007 2016-06-28
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
这点数据,最大可能性是你分析方法有问题,100条数据怎么也不可能超过1秒. 具体问题你要贴出来sql脚本内容才好说
100条数据分析时需要调用其他地方的数据,基本无法优化了。我要直接把CPU打上去,但不能有内存泄漏
  • 打赏
  • 举报
回复
可以合并一起请求的就一起合并,然后确认到底那部分耗时最多
大雨将至 2016-06-28
  • 打赏
  • 举报
回复
你解决多线程内存泄漏问题就好了嘛 看你的代码,内存泄漏是因为while(true)无限制创建新线程,解决思路是控制正在计算的总线程数,只有当一批计算完成后才开始下一批
shoppo0505 2016-06-28
  • 打赏
  • 举报
回复
这点数据,最大可能性是你分析方法有问题,100条数据怎么也不可能超过1秒. 具体问题你要贴出来sql脚本内容才好说

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧