当前位置: 首页 > news >正文

.Net 中Partitioner static与dynamic的性能对比


先看LINQ的方式,dynamic的方式:

void Main()
{
	// testing setup
	var 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: 0
LINQ way done , ticks:3472754
processing by single thread done, ticks : 380298


可见,动态分配chunk的partition基本比单线程的普通实现慢了10倍!


再看静态的方式:

void Main()
{
	// testing setup
	var 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:0
processing by range partitioner done, ticks : 185180
processing by single thread done, ticks : 375279


基本上,静态partition的方式比普通方式快两倍。


现在,依然使用静态方式,把数据量增大10倍,看LINQ输出:

creating partitioner in a way processing as static range ..
created partitioner, ticks:0
processing by range partitioner done, ticks : 1951457
processing 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来测试。

相关文章:

  • c# 中的 for vs foreach
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • 查看实时Mongodb query 命令
  • .Net 应用中使用dot trace进行性能诊断
  • 如何更改一台已经安装了SharePoint2007的服务器名称(转)
  • HTML上传文件的form enctype属性
  • BlockingCollection的使用
  • 配置本地IIS的证书访问的权限
  • 如何设置水晶报表(crystal reports)的字段自动换行
  • Xamarin nuget package update 错误
  • Xamarin部署时遇到错误: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
  • CrystalReport显示HTML标记
  • Xamarin 编译错误: The file obj-Release-android-bin-package_resources does not exist
  • 一些.NET 项目中常用的类库
  • update-database 到azure sql database
  • 【笔记】你不知道的JS读书笔记——Promise
  • Material Design
  • TCP拥塞控制
  • VUE es6技巧写法(持续更新中~~~)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 闭包--闭包作用之保存(一)
  • 测试如何在敏捷团队中工作?
  • 翻译:Hystrix - How To Use
  • 漂亮刷新控件-iOS
  • 全栈开发——Linux
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用API自动生成工具优化前端工作流
  • 通过npm或yarn自动生成vue组件
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2022 CVPR) Unbiased Teacher v2
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (四)Android布局类型(线性布局LinearLayout)
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 代码性能 - (1)
  • .net 微服务 服务保护 自动重试 Polly
  • .Net 应用中使用dot trace进行性能诊断
  • .net的socket示例
  • .NET命名规范和开发约定
  • @ComponentScan比较
  • @EnableAsync和@Async开始异步任务支持
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [CTSC2014]企鹅QQ
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [leetcode]Clone Graph
  • [mit6.s081] 笔记 Lab2:system calls
  • [MT8766][Android12] 增加应用安装白名单或者黑名单
  • [one_demo_15]模拟交通灯管理系统
  • [PHP] 面向对象
  • [Python] scikit-learn中数据集模块介绍和使用案例
  • [QT] TCP协议演示