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データ構造のバージョン番号である。
HwCountersCountBYTE1+3+3HwCounters配列に含まれるハードウェアカウンタの個数である。
ContextSwitchCountDWORD4+4+4計測期間中のコンテキストスイッチ回数である。
WaitReasonBitMapULONGLONG8+8+8スレッドの待機理由を示すビットマップである。
CycleTimeULONGLONG8+16+16スレッドが消費したCPUサイクル時間である。
RetryCountDWORD4+24+24計測の再試行回数である。
ReservedDWORD4+28+28予約フィールドである。0となる。
HwCountersHARDWARE_COUNTER_DATA256+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 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