在本节中将比较两个实验。使用用于记录事件的校准的阈值记录 test.1.er 实验,使用零阈值记录 test.2.er 实验以包括 mttest 程序执行中发生的所有同步事件。
单击工具栏上的 "Compare Experiments"(比较实验)按钮 ,或选择 "File"(文件)> "Compare Experiments"(比较实验)。
此时将打开 "Compare Experiments"(比较实验)对话框。
您已经打开的 test.1.er 实验列在 "Baseline"(基线)组中。必须创建实验列表以便与 "Comparison Group"(比较组)面板中的基线实验进行比较。
在本教程中,每个组仅包含一个实验。
单击 "Comparison Group"(比较组)旁边的 "Add"(添加)按钮,然后在 "Select Experiment"(选择实验)对话框中打开 test.2.er 实验。
在 "Compare Experiments"(比较实验)对话框中单击 "OK"(确定)以装入第二个实验。
此时将重新打开 "Overview"(概述)页面,其中包括两个实验的数据。
"Clock Profiling"(时钟分析)度量对每个度量显示两个带颜色的条,每个实验对应一个条。test.1.er "Baseline"(基线)实验中的数据位于上面。
如果在数据条上移动鼠标光标,弹出文本显示 "Baseline"(基线)和 "Comparison"(比较)组的数据以及它们之间的差异(以数值和百分比表示)。
请注意,在第二个实验中,记录的 "Total CPU Time"(CPU 总时间)稍微大些,但是有超过两倍的 "Sync Wait Counts"(同步等待计数)以及大约多于 10% 的 "Sync Wait Time"(同步等待时间)。
切换到 "Functions"(函数)视图,单击标签为 "test.1.er Incl.Sync Wait Count"(test.1.er 包含同步等待计数)的列标题,从而按第一个实验中的事件数对函数进行排序。
函数 pthread_mutex_lock() 显示 test1.er 和 test.2.er 之间在事件数上的第二大差异。最大差异位于 do_work() 中,其包括来自其直接或间接调用的所有函数的差异,包括 pthread_mutex_lock()。
选择 "Callers-Callees"(调用方-被调用方)视图。
查看其中两个调用方,lock_global() 和 lock_local()。
lock_global() 函数在 test.1.er 中对 "Attributed Sync Wait Count"(归属同步等待计数)显示 3 个事件,但是在 test.2.er 中显示 4 个事件。原因是获取 test.1.er 中的锁的第一个线程未停止,所以未记录该事件。在 test.2.er 实验中,阈值设置为记录所有事件,所以甚至记录了第一个线程的锁获取。
同样,在第一个实验中,lock_local() 没有记录的事件,因为不存在锁争用。第二个实验中有 4 个事件,即使总的来说它们具有极小的延迟。