随着微软Visual Studio 2010和.NET Framework 4.0的推出,微软向开发人员提供了创建多线程应用程序的更好的工具和类库。在这篇文章中,笔者将为您介绍Concurrency Visualizer的新功能是什么以及它能够提供什么类型的信息。
要把Visual Studio 2010的Concurrency Visualizer功能真正地应用到业务中,你需要点击最初的资源冲突表上面的三个按钮。让我们首先点击左边的处理器利用率图表(见图4)。
这个处理器利用率图表显示你的应用程序如何在使用处理器的整个状况的一个可视化的指标。这个图表显示Windows可用的逻辑处理器的数量。例如,在上面的图表中,一个英特尔酷睿2双核处理器在这个操作系统中启用了两个逻辑处理器。
虽然这个剖析会话已经就位,但是,Visual Studio不仅要收集有关你的应用程序的信息,而且还要收集这个系统中每一个其它进程使用处理器的信息。采用默认的颜色方案,你自己的应用程序的处理器利用率用绿色显示,其它进程用黄色显示,空闲时间用灰色显示。
在屏幕的上方,你可以看到一个滑动条。你可以使用这个滑动条放大和缩小这个图表。你还可以选择这个图表中的一个区域直接放大到选择中。这个图表是以时间为基础的:时间从左边向右边运行并且按照毫秒(也就是千分之一秒)显示。
成功的线程的一个指标是你的应用程序的处理器使用能够超过一个逻辑处理器的限制。如果你的应用程序是计算密集型的,你的应用程序的绿色区域越接近图表的顶端,这个应用程序利用系统中多个逻辑处理器的效率就越高。
Visual Studio提供的第二个、也是更有趣的图表是线程图表。要启动这个图表,可点击这个窗口上方的线程按钮,或者在上面的当前窗口下拉式菜单中选择同样名称的窗口。
这个线程图表(图5)显示在你的应用程序生命周期期间存在的全部线程,当你执行这个应用程序的时候显示绿色,在等待同步的时候显示为红色,在执行输入/输出操作的时候显示紫色,或者在休眠的时候显示为蓝色。你看的图表中的绿色线条越多,通常就越好。此外,除了这个线程之外,你在上面还能看到两条线,用于监视硬盘读和写。如果你有一个以上的硬盘,那么,每一个硬盘都要增加两条线。
再说一次。你可以使用鼠标放大这个图表或者选择使用上面的放大滑动条。你还可以从左上角排序这个图表。在默认状态下,线程是按照开始时间排序的。但是,你还可以通过监视的操作或者停止时间排序。
除了基本的排序之外,这个线程图表允许你使用顶端的箭头按钮按照方便的次序排列线程。这个功能是有用的,如果你需要比较两个或者更多的线程的功能的话。通过把这些线程相互之间紧密地排列在一起,你的工作会更容易。
当你要微调一个特定时间段的时候,这个线程图表中显示的线程图表完全是可点击的。这意味着在放大到足够近的时候,你能够看到以不同颜色表示的段。你可以点击每一个段查看一个特定的段的详细信息。还需要指出的是,每当你点击一个段的时候,Visual Studio如何在这个图表下面给你一些额外的指令。
每当你在线程图表中点击一个段的时候,你在这个图表下面都能看到包含有趣的信息的额外标签。例如,Visual Studio能够向你显示一个所谓的解除封锁的栈。这个栈向你提供有关允许另一个线程运行的一个线程的信息。这个示意标签也是有用的。这个非神秘化(Demystify)按钮向你提供有关这个产品中的一个特定功能的更多信息。Concurrency Visualizer功能提供的第三个主要窗口叫做内核(Cores)。从技术上说,这个名称不是很准确,因为这个内核功能的目的是显示你的应用程序利用系统中的多个逻辑处理器的效率如何。
然而,这个内核功能将发挥作用,即使你有多个物理处理器而不是多个内核。这种情况的发生是因为对于操作系统来说,一个物理处理器或者处理器中的多个内核是一样的:它们都是逻辑处理器,都能够在上面执行线程。但是,即使有这么小一点的技术准确性,“内核”这个词在这个案例中有理由是正确的,因为目前的大多数系统事实上都是采用多核处理器,而不是采用多个处理器。
这个内核窗口(见图6)允许你看到一个时间表,在这个系统上的每一个逻辑处理器上能够执行多少工作。就像使用其它两个窗口一样,你可以方法内核图片,把鼠标放在时间表上查看更多的细节。这个图表上的每一个线程都有不同的颜色,图表的下面显示文字说明。如果你的应用程序包含十几个线程,发现不同的颜色是很困难的,但是,在大多数情况下,这个图片的是很容易使用的。
理解图片
要能够看到关于你的线程的详细信息和这些线程是如何运行的对于开发人员的工具箱都是一个极好的增加的工具。然而,你编写的应用程序越复杂,理解这些图片和细节的含义就越重要。如果把事情简化一些,目前开发人员最紧迫的需求是保证应用程序能够最充分地利用当前处理器的多个内核。这个事情本身就有些复杂,但是,当你要保证你的代码开足油门运行的时候,这个事情就会更复杂。这要求理解不同的性能瓶颈以及它们如何在微软Visual Studio显示的不同的剖析图表中表现自己。
完全理解这些图表是另一篇文章的话题。但是,你首先可以从一个很好的小的Visual Studio 2010帮助主题开始。这个主题的名称是“行为糟糕的多线程应用程序的常见方式”,可以在网络上的MSDN说明文件中找到。
结论
在这篇文章中,我们学习了名为“Concurrency Visualizer”的Visual Studio 2010的新功能是什么以及它能够提供什么类型的信息。此外,你了解到你至少需要一个高级版本的微软Visual Studio软件来使用这个功能。即使使用高级版本,你还需要使用至少Windows Vista操作系统。
特别是如果你在使用Task Parallel Library (TPL,任务并行库)或者PLINQ连接你的应用程序,那么,你将从微软Visual Studio 2010中提供的新的调试和剖析工具中得到极大的好处。例如,通过使用Concurrency Visualizer把新的并行栈与并行任务结合在一起,这将更容易保证你的应用程序最充分地利用现代的多核处理器。