核心利用率:旋转

使用本主题查找核心旋转及没有做有用工作的区域。 旋转时间很短在某些情况下是有益的,比如只需等待很短时间就能得到的数据。 但是,当需要执行有用的操作时,长时间段的旋转是一种浪费。

Xbox 性能调查器 (PIX)

在所有可能旋转代码部分的周围创建一个Xbox的性能调查器 (PIX) 事件是很有用的。 可以通过在代码中使用PixBeginEventPixEndEvent来实现这一点。

使用以下步骤来研究PIX中的旋转线程。

  1. 常用步骤主题中的信息入手,创建定时捕获。

  2. 聚焦在 范围详情 并确保 要显示的项目 设置为 PIX 事件(CPU)

  3. 使用范围详情 顶部的搜索框以筛选出仅旋转事件。 在这种情况下,它的标签为 Spin,如图 1 所示。

    图 1. 显示标题旋转时添加PIX标记后出现的事件列表

    标题旋转时添加PIX标记后出现的事件列表截图

  4. 查看每个实例的 持续时间执行 列。 选择列的标题,通过该值对事件进行排序。

  5. 在图1中,高亮事件的持续时间为219毫秒,执行时间为111微秒(μs)。

  • 持续时间指事件活跃的总时间,包括线程停顿的时间。
  • 执行是指该事件活跃的总时间,以及该线程在核心上执行的时间。
  • 停止是另一种查看线程没有执行的事件持续时间的方法。
  1. 更糟糕的情况是图 1 顶部所示的 Spin 事件。 该事件执行了86毫秒,此外还有344毫秒的停顿。 CPU核心在旋转循环中执行了整整86毫秒。 这浪费了本可用于执行其他任务的时间。

Windows Performance Analyzer (WPA)

如果要确定游戏可能在 Windows 性能分析器(WPA)中旋转的区域,所有代码可能旋转的位置都应该放在一个非内联函数中,以便进行剖析构建。 这样就很容易判断旋转是否花费过多时间。 因为标题是旋转的,没有进行上下文切换,因此必须使用采样数据。 如果标题在使用 SwitchToThread在线程间快速切换,请按照主题 高上下文切换率

  1. 常见步骤主题中的信息开始,创建一个事件跟踪日志 (ETL) 文件。

  2. 如主题通用步骤中所述,使用 ThreadSpinning.wpaProfile WPA 配置文件。 图 2 显示新的分析选项卡的外观。

    图 2. 显示ThreadSpinningWPA 配置文件的默认视图

    ThreadSpinning WPA配置文件的默认视图截图

  3. 权重百分比%列显示数据表中每行样本的百分比。 这与函数所花费的总时间量高度相关,如图 3 所示。

    图 3. 按“进程”、“堆栈窗口”显示CPU使用情况(采样)利用率,其中FindingThreadingIssues进程采样数据占83%

    CPU使用率按“进程”、“堆栈窗口”采样的截图

  4. 使用数据表堆叠列的上下文菜单中的“在列中查找...”命令,通过右键单击该列来查找任何已知的旋转函数。 查看权重百分比%一列来确定是否花费过多时间旋转,如图 4 所示。

    图 4. 显示占示例 37% 的旋转函数 SpinFunc 的调用堆叠的走势情况

    旋转函数的调用栈走势屏幕截图