none
.net 4.0单元测试和Windows From对并行算法的效率影响? RRS feed

  • 问题

  • Windows 7 专业版, 16G内存,Xeon E5640 * 2 ,HT, 16逻辑核心

     

    在跑一个算法的时候,如果使用单元测试,CPU占用率100%,45秒完成

     

    如果在windows form 下开启一个 thread 跑同样的算法 需要 2分钟,CPU占用率 10-30%

     

    算法中主要是 Parallel.For

    2011年6月7日 12:23

答案

  • 操作系统是设置为优化后台,还是前台程序。

    把 thread 设置成 background模式i

    • 已标记为答案 Paul Zhou 2011年6月17日 5:28
    2011年6月8日 9:35
  • 我经过很长时间的测试分析,我觉得有必要在这里发布一个非常重要的使用Parallel.For的问题

    在大部分合理使用Parallel.For的情况下,for循环中的计算过程是独立的,相互不关联的,即 Array[i] 和 Array[i+1]没有直接的关系

    但为什么会出现在win form下开Thread效率降低,而测试代码中效率较高的情况呢?!

     

    一个重要的原因是观察者模式!

     

    一般的,复杂算法处理海量数据,其时间都比较长。那么会在算法类中提供一个 evnet 来告诉外部的观察者(一般为窗体上的进度条)运算到哪里了。但这个观察者在Parallel.For里面的开销是非常大的。一般地,当没有这个观察者的时候,Parallel.For就在老老实实干活,但有了观察者,相当于在这里又加入了一段代码,而且这段代码是仅能够单独访问的,即当调用这个event的时候,相当于在这里执行了 event += new EventHandler<T>(object sender, T e)里面的代码;对于更新进度条这件事情来说,进度条在改变他的Value的值时候,并不允许多个线程同时访问的,于是会在这里出现阻塞,于是Parallel.For的效率就下来了。

     

    所以,建议大家在Parallel.For里面,尽量不要调用event,效率下降是非常厉害的!

    • 已标记为答案 mibxue 2011年9月23日 15:41
    2011年9月22日 16:08

全部回复

  • 没有影响。。关键看你怎么调用。


    学习学习....
    2011年6月8日 6:02
  • 操作系统是设置为优化后台,还是前台程序。

    把 thread 设置成 background模式i

    • 已标记为答案 Paul Zhou 2011年6月17日 5:28
    2011年6月8日 9:35
  • 你好,

    能否提供相关的代码供大家测试分析?


    Paul Zhou [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月9日 8:25
  • 我经过很长时间的测试分析,我觉得有必要在这里发布一个非常重要的使用Parallel.For的问题

    在大部分合理使用Parallel.For的情况下,for循环中的计算过程是独立的,相互不关联的,即 Array[i] 和 Array[i+1]没有直接的关系

    但为什么会出现在win form下开Thread效率降低,而测试代码中效率较高的情况呢?!

     

    一个重要的原因是观察者模式!

     

    一般的,复杂算法处理海量数据,其时间都比较长。那么会在算法类中提供一个 evnet 来告诉外部的观察者(一般为窗体上的进度条)运算到哪里了。但这个观察者在Parallel.For里面的开销是非常大的。一般地,当没有这个观察者的时候,Parallel.For就在老老实实干活,但有了观察者,相当于在这里又加入了一段代码,而且这段代码是仅能够单独访问的,即当调用这个event的时候,相当于在这里执行了 event += new EventHandler<T>(object sender, T e)里面的代码;对于更新进度条这件事情来说,进度条在改变他的Value的值时候,并不允许多个线程同时访问的,于是会在这里出现阻塞,于是Parallel.For的效率就下来了。

     

    所以,建议大家在Parallel.For里面,尽量不要调用event,效率下降是非常厉害的!

    • 已标记为答案 mibxue 2011年9月23日 15:41
    2011年9月22日 16:08