.Net 中Partitioner static与dynamic的性能对比
来源:互联网 发布:软件著作权登记办理 编辑:程序博客网 时间:2024/05/04 15:01
先看LINQ的方式,dynamic的方式:
void Main(){// testing setupvar source = Enumerable.Range(0, 10000000).ToArray();double[] results = new double[source.Length];Console.WriteLine("creating partitioner in LINQ way...");var dt = DateTime.Now;var partitionerLinq = Partitioner.Create(source, true);Console.WriteLine("creating partitioner in LINQ done, ticks: " + (DateTime.Now - dt).Ticks);dt = DateTime.Now;var r = partitionerLinq.AsParallel().Select(x => x * x * Math.PI).ToList();Console.WriteLine("LINQ way done , ticks:" + (DateTime.Now - dt).Ticks);dt = DateTime.Now;for(var i = 0;i < source.Length; i++){results[i] = source[i] * Math.PI;}Console.WriteLine("processing by single thread done, ticks : " + (DateTime.Now - dt).Ticks);}
LINQPAD输出:
creating partitioner in LINQ way...creating partitioner in LINQ done, ticks: 0LINQ way done , ticks:3472754processing by single thread done, ticks : 380298
可见,动态分配chunk的partition基本比单线程的普通实现慢了10倍!
再看静态的方式:
void Main(){// testing setupvar source = Enumerable.Range(0, 10000000).ToArray();double[] results = new double[source.Length];Console.WriteLine("creating partitioner in a way processing as static range ..");var dt = DateTime.Now;// Partition the entire source array.var rangePartitioner = Partitioner.Create(0, source.Length);Console.WriteLine("created partitioner, ticks:" + (DateTime.Now - dt).Ticks);dt = DateTime.Now;// Loop over the partitions in parallel.Parallel.ForEach(rangePartitioner, (range, loopState) =>{// Loop over each range element without a delegate invocation.for (int i = range.Item1; i < range.Item2; i++){results[i] = source[i] * source[i] * Math.PI;}});Console.WriteLine("processing by range partitioner done, ticks : " + (DateTime.Now - dt).Ticks);dt = DateTime.Now;for(var i = 0;i < source.Length; i++){results[i] = source[i] * Math.PI;}Console.WriteLine("processing by single thread done, ticks : " + (DateTime.Now - dt).Ticks);}// Define other methods and classes here
LINQPAD输出:
creating partitioner in a way processing as static range ..created partitioner, ticks:0processing by range partitioner done, ticks : 185180processing by single thread done, ticks : 375279
基本上,静态partition的方式比普通方式快两倍。
现在,依然使用静态方式,把数据量增大10倍,看LINQ输出:
creating partitioner in a way processing as static range ..created partitioner, ticks:0processing by range partitioner done, ticks : 1951457processing by single thread done, ticks : 3808162
可以看到,时间差别依然差不多是一倍的速度。
总结,当考虑使用Partition时,最好使用静态方式;并且处理逻辑不建议过于复杂(MSDN建议:In general, range partitioning is only faster when the execution time of the delegate is small to moderate);不过这一点还有待测试,暂时没有想出合适的logic来测试。
1 0
- .Net 中Partitioner static与dynamic的性能对比
- .NET远程处理(Remoting)与WCF的性能对比
- mysql中in与exists的性能与效率对比
- PHP中require/include与require_once/include_once的性能对比
- php中switch与if的性能对比
- php中is_file与file_exists的性能对比
- Net::SSH::Perl 包 与 Net::OpenSSH 包的 性能对比代码
- eclipse中static web和dynamic web的区别
- .net中dynamic类型的使用
- ASP.NET 中 const 与 static readonly 的区别
- 关于Asp.net中static与ViewState使用的探讨
- 关于Asp.net中static与ViewState使用的探讨
- Coolite(ExtJS)的GridPanel性能与ASP.net的GridView对比
- hadoop中Partitioner、WritableComparator的自己总结
- Hadoop1.*中MapReduce的partitioner源码分析
- .NET远程处理(Remoting)与WCF的性能对比(2)
- .net性能研究1-DataSet和DataReader的性能对比
- string与StringBuilder的性能对比
- itext添加标题(heading)--http://www.cnblogs.com/anrainie/archive/2012/03/21/2410013.html
- 常用免费的WebService列表
- Linux 下执行Mysql的 sql文件
- NavigationView获取Header View的问题
- Xcode模拟器路径
- .Net 中Partitioner static与dynamic的性能对比
- [UE4]手动指定模型的材质资源文件路径(骨骼、材质、动画)
- RoboBinding探究一:TextView及EditText基础实现
- Android软件开发之获取通讯录联系人信息 + android联系人信息的存储结构 + Android联系人读取操作笔记
- flex设置DataGrid某列的字体为粗体
- Android 启动程序时动画效果(渐变)
- php中并发读写文件冲突的解决方案
- Swift学习笔记 -- 对象和类
- OC - 第十章 属性的内部实现原理