Win32 API 日本語リファレンス
ホームSystem.Performance.HardwareCounterProfiling › PERFORMANCE_DATA

PERFORMANCE_DATA

構造体
サイズx64: 288 バイト / x86: 288 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
SizeWORD2+0+0この構造体のサイズです。
VersionBYTE1+2+2この構造体のバージョンです。PERFORMANCE_DATA_VERSION に設定する必要があります。
HwCountersCountBYTE1+3+3HwCounters 配列のうち、ハードウェアカウンターのデータが格納されている配列要素の数です。値が 3 の場合は、この配列に 3 つのハードウェアカウンターのデータが含まれていることを意味し、要素 0 から 2 にカウンターデータが含まれていることを意味するわけではありません。
ContextSwitchCountDWORD4+4+4プロファイリングが有効になってから発生したコンテキストスイッチの回数です。
WaitReasonBitMapULONGLONG8+8+8前回データを読み取ってから発生したコンテキストスイッチの理由を示すビットマスクです。指定可能な値については、KWAIT_REASON 列挙型を参照してください (この列挙型は WDK の Wdm.h ファイルに含まれています)。
CycleTimeULONGLONG8+16+16プロファイリングが有効になってからのスレッドのサイクルタイム (割り込みによって費やされた時間は除く) です。
RetryCountDWORD4+24+24データの一貫したスナップショットを確保するために、読み取り操作がデータを読み取った回数です。
ReservedDWORD4+28+28予約済みです。0 に設定します。
HwCountersHARDWARE_COUNTER_DATA256+32+32カウンター値を格納する HARDWARE_COUNTER_DATA 構造体の配列です。カウンターデータを格納する配列の要素は、EnableThreadProfiling 関数を呼び出したときに指定した HardwareCounters ビットマスクで設定したビットに直接対応します。たとえば、HardwareCounters ビットマスクのビット 3 を設定した場合、HwCounters[3] にそのカウンターのデータが格納されます。

公式ドキュメント

要求したスレッドプロファイリングデータおよびハードウェアカウンターデータを格納します。

解説(Remarks)

プロファイリングデータを読み取るために ReadThreadProfilingData 関数を呼び出す前に、Size メンバーと Version メンバーを初期化する必要があります。

この構造体に格納されるプロファイルデータは、ReadThreadProfilingData 関数を呼び出したときに要求したデータによって異なります。READ_THREAD_PROFILING_FLAG_DISPATCHING フラグを指定した場合は、次のメンバーが設定されます。

READ_THREAD_PROFILING_FLAG_HARDWARE_COUNTERS フラグを指定した場合は、次のメンバーが設定されます。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// HARDWARE_COUNTER_DATA  (x64 16 / x86 16 バイト)
typedef struct HARDWARE_COUNTER_DATA {
    HARDWARE_COUNTER_TYPE Type;
    DWORD Reserved;
    ULONGLONG Value;
} HARDWARE_COUNTER_DATA;

// PERFORMANCE_DATA  (x64 288 / x86 288 バイト)
typedef struct PERFORMANCE_DATA {
    WORD Size;
    BYTE Version;
    BYTE HwCountersCount;
    DWORD ContextSwitchCount;
    ULONGLONG WaitReasonBitMap;
    ULONGLONG CycleTime;
    DWORD RetryCount;
    DWORD Reserved;
    HARDWARE_COUNTER_DATA HwCounters[16];
} PERFORMANCE_DATA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct HARDWARE_COUNTER_DATA
{
    public int Type;
    public uint Reserved;
    public ulong Value;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PERFORMANCE_DATA
{
    public ushort Size;
    public byte Version;
    public byte HwCountersCount;
    public uint ContextSwitchCount;
    public ulong WaitReasonBitMap;
    public ulong CycleTime;
    public uint RetryCount;
    public uint Reserved;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public HARDWARE_COUNTER_DATA[] HwCounters;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure HARDWARE_COUNTER_DATA
    Public Type As Integer
    Public Reserved As UInteger
    Public Value As ULong
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure PERFORMANCE_DATA
    Public Size As UShort
    Public Version As Byte
    Public HwCountersCount As Byte
    Public ContextSwitchCount As UInteger
    Public WaitReasonBitMap As ULong
    Public CycleTime As ULong
    Public RetryCount As UInteger
    Public Reserved As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public HwCounters() As HARDWARE_COUNTER_DATA
End Structure
import ctypes
from ctypes import wintypes

class HARDWARE_COUNTER_DATA(ctypes.Structure):
    _fields_ = [
        ("Type", ctypes.c_int),
        ("Reserved", wintypes.DWORD),
        ("Value", ctypes.c_ulonglong),
    ]

class PERFORMANCE_DATA(ctypes.Structure):
    _fields_ = [
        ("Size", ctypes.c_ushort),
        ("Version", ctypes.c_ubyte),
        ("HwCountersCount", ctypes.c_ubyte),
        ("ContextSwitchCount", wintypes.DWORD),
        ("WaitReasonBitMap", ctypes.c_ulonglong),
        ("CycleTime", ctypes.c_ulonglong),
        ("RetryCount", wintypes.DWORD),
        ("Reserved", wintypes.DWORD),
        ("HwCounters", HARDWARE_COUNTER_DATA * 16),
    ]
#[repr(C)]
pub struct HARDWARE_COUNTER_DATA {
    pub Type: i32,
    pub Reserved: u32,
    pub Value: u64,
}

#[repr(C)]
pub struct PERFORMANCE_DATA {
    pub Size: u16,
    pub Version: u8,
    pub HwCountersCount: u8,
    pub ContextSwitchCount: u32,
    pub WaitReasonBitMap: u64,
    pub CycleTime: u64,
    pub RetryCount: u32,
    pub Reserved: u32,
    pub HwCounters: [HARDWARE_COUNTER_DATA; 16],
}
import "golang.org/x/sys/windows"

type HARDWARE_COUNTER_DATA struct {
	Type int32
	Reserved uint32
	Value uint64
}

type PERFORMANCE_DATA struct {
	Size uint16
	Version byte
	HwCountersCount byte
	ContextSwitchCount uint32
	WaitReasonBitMap uint64
	CycleTime uint64
	RetryCount uint32
	Reserved uint32
	HwCounters [16]HARDWARE_COUNTER_DATA
}
type
  HARDWARE_COUNTER_DATA = record
    Type: Integer;
    Reserved: DWORD;
    Value: UInt64;
  end;

  PERFORMANCE_DATA = record
    Size: Word;
    Version: Byte;
    HwCountersCount: Byte;
    ContextSwitchCount: DWORD;
    WaitReasonBitMap: UInt64;
    CycleTime: UInt64;
    RetryCount: DWORD;
    Reserved: DWORD;
    HwCounters: array[0..15] of HARDWARE_COUNTER_DATA;
  end;
const HARDWARE_COUNTER_DATA = extern struct {
    Type: i32,
    Reserved: u32,
    Value: u64,
};

const PERFORMANCE_DATA = extern struct {
    Size: u16,
    Version: u8,
    HwCountersCount: u8,
    ContextSwitchCount: u32,
    WaitReasonBitMap: u64,
    CycleTime: u64,
    RetryCount: u32,
    Reserved: u32,
    HwCounters: [16]HARDWARE_COUNTER_DATA,
};
type
  HARDWARE_COUNTER_DATA {.bycopy.} = object
    Type: int32
    Reserved: uint32
    Value: uint64

  PERFORMANCE_DATA {.bycopy.} = object
    Size: uint16
    Version: uint8
    HwCountersCount: uint8
    ContextSwitchCount: uint32
    WaitReasonBitMap: uint64
    CycleTime: uint64
    RetryCount: uint32
    Reserved: uint32
    HwCounters: array[16, HARDWARE_COUNTER_DATA]
struct HARDWARE_COUNTER_DATA
{
    int Type;
    uint Reserved;
    ulong Value;
}

struct PERFORMANCE_DATA
{
    ushort Size;
    ubyte Version;
    ubyte HwCountersCount;
    uint ContextSwitchCount;
    ulong WaitReasonBitMap;
    ulong CycleTime;
    uint RetryCount;
    uint Reserved;
    HARDWARE_COUNTER_DATA[16] HwCounters;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; PERFORMANCE_DATA サイズ: 288 バイト(x64)
dim st, 72    ; 4byte整数×72(構造体サイズ 288 / 4 切り上げ)
; Size : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; Version : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; HwCountersCount : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; ContextSwitchCount : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; WaitReasonBitMap : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; CycleTime : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; RetryCount : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; Reserved : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; HwCounters : HARDWARE_COUNTER_DATA (+32, 256byte)  varptr(st)+32 を基点に操作(256byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global HARDWARE_COUNTER_DATA
    #field int Type
    #field int Reserved
    #field int64 Value
#endstruct

#defstruct global PERFORMANCE_DATA
    #field short Size
    #field byte Version
    #field byte HwCountersCount
    #field int ContextSwitchCount
    #field int64 WaitReasonBitMap
    #field int64 CycleTime
    #field int RetryCount
    #field int Reserved
    #field HARDWARE_COUNTER_DATA HwCounters 16
#endstruct

stdim st, PERFORMANCE_DATA        ; NSTRUCT 変数を確保
st->Size = 100
mes "Size=" + st->Size