使用Intel Thread Profiler查看Parallel.For性能

简介:
    Intel Thread Profiler是intel公司发布的一个优化线程的可视化工具。它有助于您了解线程应用的结构,最大限度提升应用性能。同时可以快速准确找到影响程序执行时间的代码位置。今天的文章就是使用该工具来对比一下使用Microsoft Parallel Extensions Jun08 CTP 中的Parallel.For与我们平时使用的for语句在CPU运行时性能参数的一些不同之处。
 
     下面是我们平时使用for方式来遍历集合的例子
1.使用普通的for循环来遍历列表:
 
private   static   void  Ex1Task2_UserForLoop()
{
            EmployeeList employeeData 
=   new  EmployeeList();

            Console.WriteLine(
" Non-parallelized for loop " );

            DateTime start 
=  DateTime.Now;
            Console.WriteLine(
" Payroll process started at {0} " , start);
            
for  ( int  i  =   0 ; i  <  employeeData.Count; i ++ )
            {
                Console.WriteLine(
" Starting process for employee id {0} " ,
                    employeeData[i].EmployeeID);
                
decimal  span  =  PayrollServices.GetPayrollDeduction(employeeData[i]);
                Console.WriteLine(
" Completed process for employee id {0} process took {1} seconds " ,
                    employeeData[i].EmployeeID, span);
                Console.WriteLine();
            }

            DateTime end 
=  DateTime.Now;
            TimeSpan jobTime 
=  end.Subtract(start);

            Console.WriteLine(
" Payroll finished at {0} and took {1} " , end, jobTime);
            Console.WriteLine();
}
 
2.使用并行方式Parallel.For的代码:
private   static   void  Ex1Task2_UseParallelForMethod()
{
            Parallel.For(
0 , employeeData.Count, i  =>
            {
                Console.WriteLine(
" Starting process for employee id {0} " , employeeData[i].EmployeeID);
                
decimal  span  =  PayrollServices.GetPayrollDeduction(employeeData[i]);
                Console.WriteLine(
" Completed process for employee id {0} " , employeeData[i].EmployeeID);
                Console.WriteLine();
            });

 
     下面就是两者在intel thread profiler下执行时的性能参数,首先是普遍for循环方式:
 
    这里有必要说明一下图中红框中的四个指标:
     Processor Queue Length:是指处理队列中的线程数。即使在有多个处理器的计算机上处理器时间也会有一个单队列。不象磁盘计数器,这个计数器仅计数就绪的线程,而不计数 运行中的线程。如果处理器队列中总是有两个以上的线程通常表示处理器堵塞。这个计数器仅显示上一次观察的值;而不是一个平均值。
     Context Switches per Second:每秒线程切换次数,  在有的书中翻译成上下文切换,实际含义是任务切换,或CPU寄存 器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内
容。这些内容保存在任务的当前状况保存区(Tasks Context Storage area),也就是任务自己的栈区之中。入栈工作完 成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过 程叫做任务切换。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的 时间取决于CPU有多少寄存器要入栈。更多的内容参见这篇文章, 还有一篇比较有意思的文章是蔡学庸先生写的,链接在 这里
     Privileged Time(CPU内核时间)是在特权模式下处理线程执行代码所花时间的百分比。如果该参数值和"physical Disk"参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。另外设置Tempdb in RAM,减低"max async IO","max lazy writer IO"等措施都会降低该值。
     Processor Time: 指处理器执行非闲置线程时间的百分比。这个计数器 设计成用来作为处理器活动的主要指示器。它通过在每个范例间隔中衡量处理器用于执行闲置处理线程的时间,并且用100%减去该值得出。(每个处理器有一个闲置线程,该线程在没有其它线程可以运行时消耗周期)。可将其视为范例间隔用于做有用工作的百分比。
 
    下面是使用Parallel.For的运行参数截图:
 
    我们可以对比看一下这四个指标:                                                                      
     Processor Queue Length:普通for循环下是其平均值为1.7,而Parallel.For下是6.9,通过该值可以看出Parallel.For会生成更多的线程加入到CPU的任务队列之中。
 
     C ontext Switch/Sec :普遍for循环下是其平均值为7889.6,而Parallel.For下是16966.9。而该值上后者比前者高出一倍的原因我想主要就是在Processor Queue Length上,因为我记得windowsnt下CPU的每个时间片的长度是20微秒,而如果CPU当前执行的任务未完成而时间片已用完就会造成Context Switch。而频繁的切换也是影响系统性能的重要因素之一。(这里我想Parallel.For本身在使用上也不是说只要用了就会有怎么的速度和性能上的提升,还要看Parallel.For中的代码会不会出现频繁的Context Switch) 。
 
     Privileged Time : 普遍for循环下是其平均值为9.623,而Parallel.For下是21.211。该值也是后者高于前者,原因我想应该是由于CPU的使用率高了,导致要不断的到内存(或硬盘等外设)中访问操作数据(比如打印结果到屏幕等),而些操作所耗时间最后是要算在Privileged Time(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有 内存)中的。
    
     Processor Time: 普遍for循环下是其平均值为11.892,而Parallel.For下是32.161。我想这个结果应该是我们希望看到了,必定使用 Parallel.For会让我们的CPU"全身心"的投入到工作中,而这最终会让我们的程序运行的更快,效率更高。
 
    通过本例可以看出,通过Parallel.For可以提升CPU的运行效率(创建多线程),但同时也造成了更多的ContextSwitch,而切换的频繁程度与当前任务队列中的线程数量有一定关系。看来在使用Parallel.For时,我们还要考虑诸如 Context Switch这类因素对程序运行时间的影响,当然也不是所有的应用都适合于Parallel.For这类的并行开发方式。在进行并行开发时要提升性能也有一些门道,比如在Microsoft Parallel Extensions Jun08 CTP中的帮助文档中有一篇Performance Tips就介绍了一些"点子"。
 
     Tags:intel thread profiler 性能 线程 并行 Parallel


本文转自 daizhenjun 51CTO博客,原文链接:http://blog.51cto.com/daizhj/126195,如需转载请自行联系原作者
相关文章
|
11月前
|
新制造 芯片 异构计算
较上代性能提升21%,功耗降低40%,Intel 4工艺细节曝光
较上代性能提升21%,功耗降低40%,Intel 4工艺细节曝光
427 0
|
SQL 监控 关系型数据库
Intel PAUSE指令变化如何影响MySQL的性能
x86、arm指令都很多,无论是应用程序员还是数据库内核研发大多时候都不需要对这些指令深入理解,但是 Pause 指令和数据库操作太紧密了,本文通过一次非常有趣的性能优化来引入对 Pause 指令的理解,期望可以事半功倍地搞清楚 CPU指令集是如何影响你的程序的。
Intel PAUSE指令变化如何影响MySQL的性能
|
编解码 Rust 算法
性能可期——Netflix与Intel优化SVT-AV1
四月初,英特尔和Netflix宣布联合开发了一款名为SVT-AV1的视频编码器软件。可扩展视频技术(SVT)是英特尔的开源框架,它为可视化云技术的开发人员提供了高性能的视频编码软件库。本文将介绍Netflix迄今为止在SVT-AV1积累的经验,以及如何能让您也能参与到这一开发中来。本文来自Netflix技术博客,LiveVideoStack对原文进行摘译。
740 0
性能可期——Netflix与Intel优化SVT-AV1
|
弹性计算 虚拟化 KVM
Intel Xeon E5-2682v4 2.5 GHz 性能怎么样?阿里云ECS服务器
Intel Xeon E5-2682v4 2.5 GHz 性能怎么样?阿里云ECS服务器 阿里云 优 惠 地 址https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=q3dtcrrv 阿里云ECS服务器是一种弹性可伸缩的云服务器,通过虚拟化平台将服务器集群虚拟为多个性能可配的虚拟机(KVM),对整个集群系统中所有KVM进行监控和管理,并根据实际资源使用情况灵活 分配和调度资源池。
4336 0
|
弹性计算 虚拟化 KVM
Intel Xeon Gold 6149 3.1GHz CPU性能怎么样?阿里云ECS服务器
Intel Xeon Gold 6149 3.1GHz CPU性能怎么样?阿里云ECS服务器 阿里云 优 惠 地 址https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=q3dtcrrv 阿里云ECS服务器是一种弹性可伸缩的云服务器,通过虚拟化平台将服务器集群虚拟为多个性能可配的虚拟机(KVM),对整个集群系统中所有KVM进行监控和管理,并根据实际资源使用情况灵活 分配和调度资源池。
6545 0
|
11月前
|
存储 弹性计算 编解码
阿里云CPU服务器c7、g7和r7处理器Intel Xeon(Ice Lake) Platinum 8369B
阿里云第七代云服务器ECS计算型c7、通用型g7和内存型r7实例,CPU处理器采用2.7 GHz主频的Intel Xeon(Ice Lake) Platinum 8369B,全核睿频3.5 GHz,计算性能稳定。c7、g7和r7区别CPU内存比,阿里云服务器网来详细说下阿里云第七代云服务器c7、g7和r7实例CPU性能评测:
222 0

热门文章

最新文章