ホーム › 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 | データ構造のバージョン番号である。 |
| HwCountersCount | BYTE | 1 | +3 | +3 | HwCounters配列に含まれるハードウェアカウンタの個数である。 |
| ContextSwitchCount | DWORD | 4 | +4 | +4 | 計測期間中のコンテキストスイッチ回数である。 |
| WaitReasonBitMap | ULONGLONG | 8 | +8 | +8 | スレッドの待機理由を示すビットマップである。 |
| CycleTime | ULONGLONG | 8 | +16 | +16 | スレッドが消費したCPUサイクル時間である。 |
| RetryCount | DWORD | 4 | +24 | +24 | 計測の再試行回数である。 |
| Reserved | DWORD | 4 | +28 | +28 | 予約フィールドである。0となる。 |
| HwCounters | HARDWARE_COUNTER_DATA | 256 | +32 | +32 | 各ハードウェアカウンタのデータを保持するHARDWARE_COUNTER_DATA配列である。 |
各言語での定義
#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