ホーム › System.Performance.HardwareCounterProfiling › PERFORMANCE_DATA
PERFORMANCE_DATA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Size | WORD | 2 | +0 | +0 | この構造体のサイズです。 |
| Version | BYTE | 1 | +2 | +2 | この構造体のバージョンです。PERFORMANCE_DATA_VERSION に設定する必要があります。 |
| HwCountersCount | BYTE | 1 | +3 | +3 | HwCounters 配列のうち、ハードウェアカウンターのデータが格納されている配列要素の数です。値が 3 の場合は、この配列に 3 つのハードウェアカウンターのデータが含まれていることを意味し、要素 0 から 2 にカウンターデータが含まれていることを意味するわけではありません。 |
| ContextSwitchCount | DWORD | 4 | +4 | +4 | プロファイリングが有効になってから発生したコンテキストスイッチの回数です。 |
| WaitReasonBitMap | ULONGLONG | 8 | +8 | +8 | 前回データを読み取ってから発生したコンテキストスイッチの理由を示すビットマスクです。指定可能な値については、KWAIT_REASON 列挙型を参照してください (この列挙型は WDK の Wdm.h ファイルに含まれています)。 |
| CycleTime | ULONGLONG | 8 | +16 | +16 | プロファイリングが有効になってからのスレッドのサイクルタイム (割り込みによって費やされた時間は除く) です。 |
| RetryCount | DWORD | 4 | +24 | +24 | データの一貫したスナップショットを確保するために、読み取り操作がデータを読み取った回数です。 |
| Reserved | DWORD | 4 | +28 | +28 | 予約済みです。0 に設定します。 |
| HwCounters | HARDWARE_COUNTER_DATA | 256 | +32 | +32 | カウンター値を格納する HARDWARE_COUNTER_DATA 構造体の配列です。カウンターデータを格納する配列の要素は、EnableThreadProfiling 関数を呼び出したときに指定した HardwareCounters ビットマスクで設定したビットに直接対応します。たとえば、HardwareCounters ビットマスクのビット 3 を設定した場合、HwCounters[3] にそのカウンターのデータが格納されます。 |
公式ドキュメント
要求したスレッドプロファイリングデータおよびハードウェアカウンターデータを格納します。
解説(Remarks)
プロファイリングデータを読み取るために ReadThreadProfilingData 関数を呼び出す前に、Size メンバーと Version メンバーを初期化する必要があります。
この構造体に格納されるプロファイルデータは、ReadThreadProfilingData 関数を呼び出したときに要求したデータによって異なります。READ_THREAD_PROFILING_FLAG_DISPATCHING フラグを指定した場合は、次のメンバーが設定されます。
- ContextSwitchCount
- CycleTime
- RetryCount
- WaitReasonBitMap
- HwCounters
- HwCountersCount
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
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 Structureimport 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