Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 性能Linq_.net_Performance_Linq_Plinq_Parallel.foreach - Fatal编程技术网

.net 性能Linq

.net 性能Linq,.net,performance,linq,plinq,parallel.foreach,.net,Performance,Linq,Plinq,Parallel.foreach,今天我测试了Linq和PLinq querys的性能影响。 所以我就用了这篇文章 测试环境:Win7 Enterprise上的LinqPad4,64位,8GB RAM,I7-2600(8核) 我明白了,但无法解释,为什么一个核心上的查询(度量值1)比并行查询更快。我是否必须添加更多的选定代理才能从并行任务中获益 但现在的结果是: 1.运行:可枚举范围为60000: Timer frequency in ticks per second = 3312851 Measuring 1 Total ti

今天我测试了Linq和PLinq querys的性能影响。 所以我就用了这篇文章

测试环境:Win7 Enterprise上的LinqPad4,64位,8GB RAM,I7-2600(8核)

我明白了,但无法解释,为什么一个核心上的查询(度量值1)比并行查询更快。我是否必须添加更多的选定代理才能从并行任务中获益

但现在的结果是:

1.运行:可枚举范围为60000:

Timer frequency in ticks per second = 3312851
Measuring 1
Total ticks: 3525 - Elapsed time: 1 ms
Measuring 2
Total ticks: 15802 - Elapsed time: 4 ms
Measuring 3
Total ticks: 5940 - Elapsed time: 1 ms
Measuring 4
Total ticks: 26862 - Elapsed time: 8 ms
Measuring 5
Total ticks: 4387 - Elapsed time: 1 ms
2.运行:可枚举范围为600000000:

Timer frequency in ticks per second = 3312851
Measuring 1
Total ticks: 29740243 - Elapsed time: 8977 ms
Measuring 2
Total ticks: 33722438 - Elapsed time: 10179 ms
Measuring 3
Total ticks: 77145502 - Elapsed time: 23286 ms
Measuring 4
Total ticks: 120078284 - Elapsed time: 36246 ms
Measuring 5
Total ticks: 30899585 - Elapsed time: 9327 ms
有趣的事实:在执行测试脚本之前使用垃圾收集器将大大增加度量4的时间:

3.运行:可枚举范围为600000000,垃圾收集器(来自LinqPad):


总之,我可以说方法1是执行小型select查询的最合适选项,方法5是select代理增加时的最合适选项吗

你的计算很便宜。它们甚至不是非并行LINQ的好候选,因为委托调用可能比计算本身更昂贵。PLINQ还有很多额外的开销,比如启动任务、跨线程同步和复制数据。试试这个:

bool Where(int i) {
 var sum = 0; 
 for (10000 times) {
  sum += i;
 }
 return i % 3 == 0;
}
并在where子句中使用该函数。此函数非常昂贵,因此线程和同步带来的开销将不再支配运行时间


因此,基本上,您正在测量PLINQ的最坏用例。尝试测量一个有趣的参数。

模和
数学。Sqrt
不适合PLINQ,因为它们很简单(太快)。越贵越好。你可能还想看看,我列出了一些值得推荐的阅读资料。你有什么实际问题吗?还是你只是想开始讨论?如果是这样的话,那么你的“问题”就不适合这样。不,我不想开始讨论,只想知道哪种方法是做大量工作的最佳方法。并且不太确定代表们是否会吝啬于发表有保留的声明。根据msdn,它是。据这里的人说,不是
Timer frequency in ticks per second = 3312851
Measuring 1
Total ticks: 29597830 - Elapsed time: 8934 ms
Measuring 2
Total ticks: 33532083 - Elapsed time: 10121 ms
Measuring 3
Total ticks: 76403692 - Elapsed time: 23062 ms
Measuring 4
Total ticks: 58534548 - Elapsed time: 17668 ms
Measuring 5
Total ticks: 32943622 - Elapsed time: 9944 ms
bool Where(int i) {
 var sum = 0; 
 for (10000 times) {
  sum += i;
 }
 return i % 3 == 0;
}