如果尚未收集 mttest 的性能数据,则您必须先进行收集,然后在性能分析器的两个单独实例中打开两个实验 mttest.1.er 和 mttest.2.er。有关说明,请参见为 mttest 示例收集数据。
本部分的示例显示数据的全局锁和局部锁对程序性能的影响。
两个函数具有近似相同的相容用户 CPU 时间。这表明两个函数将完成等量工作。但是,lock_global() 具有较高的同步等待时间,而 lock_local() 则没有。
两个函数的注释源代码显示了此情况的原因。
lock_global() 使用全局锁保护所有数据。由于使用了全局锁,所有运行的线程都必须争相访问数据,而每次只有一个线程可访问这些数据。其余线程必须等待,直到工作线程释放对数据访问权的锁定为止。此行源代码负责同步等待时间。
lock_local() 只锁定特定线程工作块中的数据。任何线程都无法访问另一个线程的工作块,因此每个线程都可以继续,而无需竞争或浪费时间等待同步。此行源代码(由此时起为 lock_local())的同步等待时间为零。
与在四 CPU 实验中一样,两个函数具有相同的相容用户 CPU 时间,因此它们将完成等量工作。同步行为也和对四 CPU 系统的行为相同:lock_global() 耗用大量时间进行同步等待,而 lock_local() 则不会。
但是,lock_global() 的总 LWP 时间实际上要少于 lock_local() 的对应时间。这是因为每一锁定方案在确定线程在 CPU 上的运行时间时所采用的方式不同。由 lock_global() 设置的全局锁允许每个线程依次执行,直到它运行完毕为止。由 lock_local() 设置的局部锁将每个线程安排到 CPU 上以作为其运行的一部分,然后重复此过程,直到所有线程都运行完毕为止。在两种情况下,线程均要花费大量时间用于等待工作。lock_global() 中的线程将等待锁定。此等待时间出现在“相容同步等待时间”度量以及“其它等待时间”度量中。lock_local() 中的线程将等待 CPU。此等待时间出现在“等待 CPU 时间”度量中。
在 [设置数据表示] 对话框(应仍处于打开状态)中,执行以下操作: