EVENT_DATA 结构

C++ Build Insights SDK 与 Visual Studio 2017 及更高版本兼容。 若要查看这些版本对应的文档,请将本文的 Visual Studio“版本”选择器控件设置为 Visual Studio 2017 或更高版本。 它位于此页面上目录表的顶部。

EVENT_DATA 结构描述了分析或重新记录会话中的事件。 AnalyzeAnalyzeAAnalyzeWRelogRelogARelogW 函数启动这些会话。

语法

typedef struct EVENT_DATA_TAG
{
    unsigned short          EventId;
    unsigned long long      EventInstanceId;

    long long               TickFrequency;
    long long               StartTimestamp;
    long long               StopTimestamp;
    long long               ExclusiveDurationTicks;
    long long               CPUTicks;
    long long               ExclusiveCPUTicks;
    long long               WallClockTimeResponsibilityTicks;
    long long               ExclusiveWallClockTimeResponsibilityTicks;

    const void*             Data;

    unsigned long           ProcessId;
    unsigned long           ThreadId;
    unsigned short          ProcessorIndex;

    const char*             EventName;
    const wchar_t*          EventWideName;

} EVENT_DATA;

成员

名称 描述
EventId 标识事件的数字。 有关事件标识符的列表,请参阅 EVENT_ID
EventInstanceId 在跟踪中唯一标识当前事件的数字。 当多次分析或重新记录相同的跟踪时,此值不会改变。 使用此字段来在多个通过同一跟踪的分析或重新记录过程中标识同一个事件。
TickFrequency 在计算持续时间(以“滴答”为计量单位)时使用的每秒滴答数。
StartTimestamp 如果这一事件是“活动”,则此字段为在活动启动时捕获的滴答值。 如果这一事件是“简单事件”,则此字段为在事件发生时捕获的滴答值。
StopTimestamp 如果这一事件是“活动”,则此字段为在活动停止时捕获的滴答值。 如果还没有收到这一活动的停止事件,则此字段为 0。 如果这一事件是“简单事件”,则此字段设置为 0。
ExclusiveDurationTicks 如果这一事件是“活动”,则此字段为这一活动中直接发生的滴答数。 子活动中发生的滴答数被排除在外。 对于“简单事件”,此字段为 0。
CPUTicks 如果这一事件是“活动”,则此字段为在这一活动期间发生的 CPU 滴答数。 CPU 滴答不同于常规滴答。 只有当 CPU 在活动中执行代码时,才对 CPU 滴答进行计数。 当与活动关联的线程处于睡眠状态时,不会对 CPU 滴答进行计数。 对于“简单事件”,此字段为 0。
ExclusiveCPUTicks 此字段与 CPUTicks 的含义相同,不同之处在于此字段不包括子活动中发生的 CPU 滴答数。 对于“简单事件”,此字段为 0。
WallClockTimeResponsibilityTicks 如果这一事件是“活动”,则此字段为表示这一活动对总时钟时间的贡献的滴答计数。 时钟时间责任滴答不同于常规滴答。 时钟时间责任滴答考虑了活动之间的并行度。 例如,两个并行活动的持续时间可能为 50 个滴答,并且开始时间和停止时间相同。 在此示例中,两个活动都会分配有 25 个时钟时间责任滴答。 对于“简单事件”,此字段为 0。
ExclusiveWallClockTimeResponsibilityTicks 此字段与 WallClockTimeResponsibilityTicks 的含义相同,不同之处在于此字段不包括子活动中发生的时钟时间责任滴答数。 对于“简单事件”,此字段为 0。
Data 指向存储在事件中的其他数据。 所指向的数据的类型因 EventId 字段而异。
ProcessId 发生了事件的进程的标识符。
ThreadId 发生了事件的线程的标识符。
ProcessorIndex 发生了事件的 CPU 编号(从零开始编制索引)。
EventName 包含由 EventId 标识的实体的名称的 ANSI 字符串。
EventWideName 包含由 EventId 标识的实体的名称的宽字符串。

备注

EVENT_DATA 中的许多字段都包含滴答计数。 C++ Build Insights 使用 Windows 的性能计数器作为滴答源。 滴答计数必须与 TickFrequency 字段一起使用,以将其转换为适当的时间单位(如秒)。 请参阅下面的滴答转换示例

EVENT_DATA 不包含用于活动的常规滴答计数的字段。 若要获取此值,请用 StopTimestamp 减去 StartTimestamp

EVENT_DATA 是供 C API 用户使用的结构。 对于 C++ API 用户,像 Event 这样的类会自动进行时间转换。

EVENT_DATA Data 字段的值取决于其 EventId 字段的值。 下表描述了 Data 的值。 下表中可能缺少一些实体标识符。 在此示例中,Data 字段设置为 nullptr 或 0。

EventId Data 所指向的类型
EVENT_ID_BACK_END_PASS CL_PASS_DATA
EVENT_ID_COMMAND_LINE const wchar_t
EVENT_ID_COMPILER INVOCATION_DATA
EVENT_ID_ENVIRONMENT_VARIABLE NAME_VALUE_PAIR_DATA
EVENT_ID_EXECUTABLE_IMAGE_OUTPUT FILE_DATA
EVENT_ID_EXP_OUTPUT FILE_DATA
EVENT_ID_FILE_INPUT FILE_DATA
EVENT_ID_FORCE_INLINE FUNCTION_FORCE_INLINEE_DATA
EVENT_ID_FRONT_END_FILE FRONT_END_FILE_DATA
EVENT_ID_FRONT_END_PASS CL_PASS_DATA
EVENT_ID_FUNCTION FUNCTION_DATA
EVENT_ID_IMP_LIB_OUTPUT FILE_DATA
EVENT_ID_LIB_OUTPUT FILE_DATA
EVENT_ID_LINKER INVOCATION_DATA
EVENT_ID_OBJ_OUTPUT FILE_DATA
EVENT_ID_SYMBOL_NAME SYMBOL_NAME_DATA
EVENT_ID_TEMPLATE_INSTANTIATION TEMPLATE_INSTANTIATION_DATA

滴答转换示例

//
// We have the elapsed number of ticks, along with the
// number of ticks per second. We use these values
// to convert to the number of elapsed microseconds.
// To guard against loss-of-precision, we convert
// to microseconds *before* dividing by ticks-per-second.
//

long long ConvertDurationToMicroseconds(const sruct EVENT_DATA& eventData)
{
    long long duration = eventData.StopTimestamp - eventData.StartTimestamp;
    long long duration *= 1000000;
    return duration / eventData.TickFrequency;
}