#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
#uselib "pdh.dll"
#func PdhOpenQuery "PdhOpenQuery" int,int,int
#func PdhCloseQuery "PdhCloseQuery" int
#func PdhAddCounter "PdhAddCounterA" int,sptr,int,int
#func PdhCollectQueryData "PdhCollectQueryData" int
#func PdhGetFormattedCounterValue "PdhGetFormattedCounterValue" int,int,int,int
#packopt hide 1
#packopt name "nbk_bench"
// 設定
bx = 3096 ; 処理解像度 X
by = 3096 ; 処理解像度 Y
process = 4 ; 処理する、偽装スレッド(プロセス)の数
wx = 340 : wy = 240 ; ウィンドウのサイズ
write_hdd = 1024*1024*100 ; HDDベンチ用のバッファ (byte)
reload = 2 ; 何秒ごとに画面を更新するか
ct2 = 1 ; 一時カウンタ
bmp_file = ""+dir_desktop+"\\temp.bmp"
type = "シングル (Single)","デュアル (Dual)","トリプル (Triple)","クアッド (Quad)","?","?","?","オクタ"
// 自分のプロセス番号
cmdline = dir_cmdline ; cmdline = "p,n"
number = int(strmid(cmdline,0,1)) ; 自分のプロセス番号
if number ! 0 : process = int(strmid(cmdline,2,3)) ; プロセス数
if number = 0{
// プロセッサー使用率取得のための初期化
alloc CounterValue, 16
PdhOpenQuery 0, 0, varptr(hQuery)
path = "\\Processor(_Total)\\% Processor Time"
PdhAddCounter hQuery, varptr(path), 0, varptr(hCounter)
PdhCollectQueryData hQuery
}
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// レジストリ読み込み用
#include "advapi32.as"
; powered by http://www.setsuki.com/hsp/
#define HKEY_CURRENT_USER 0 ;0x80000001
#define HKEY_LOCAL_MACHINE 1 ;0x80000002
#define HKEY_USERS 2 ;0x80000003
#define HKEY_CLASSES_ROOT 3 ;0x80000000
#define HKEY_DYN_DATA 4 ;0x80000006
#define HKEY_PERFORMANCE_DATA 5 ;0x80000004
#module
#define KEY_ALL_ACCESS 0xF003F
#define REG_BINARY 3 ;バイナリデータ
#define REG_DWORD 4 ;32ビット整数
#define REG_DWORD_BIG_ENDIAN 5 ;バイト順がWindowsと逆の32ビット値
#define REG_EXPAND_SZ 2 ;展開前の環境変数( 例えば %PATH% )
#define REG_LINK 6 ;Unicodeシンボリック
#define REG_MULTI_SZ 7 ;二つのVBNULLCHARで終わる文字列
#define REG_NONE 0 ;未定義のタイプ
#define REG_RESTORE_LIST 8 ;デバイスドライバリソースリスト
#define REG_SZ 1 ;文字列
#deffunc reginit
;最初に使用する変数を設定
Key.0 = 0x80000001
Key.1 = 0x80000002
Key.2 = 0x80000003
Key.3 = 0x80000000
Key.4 = 0x80000006
Key.5 = 0x80000004
Type.0 = REG_DWORD
Type.1 = REG_SZ
Type.2 = REG_BINARY
return
#deffunc regend onexit
;最後にレジストリキーを閉じる
if hkey : RegCloseKey hkey : hkey=0
return
#deffunc regkey int p1, str kname, int p2
mref stt,64
if(p1<0)||(p2>5) : stt=1 : return
;以前のレジストリキーを閉じる
if hkey : RegCloseKey hkey : hkey=0
;文字列をコピー
sdim subkey, strlen(kname)+1 : subkey=kname
if p2 == 0 {
;レジストリキーを開く
RegOpenKeyEx Key.p1, varptr(subkey), 0, KEY_ALL_ACCESS, varptr(hKey)
} else {
;新しいレジストリキーを作成
RegCreateKeyEx Key.p1, varptr(subkey), 0, varptr(class), 0, KEY_ALL_ACCESS, 0, varptr(hKey), 0
}
return
#deffunc getreg var p1, str kname, int p2, int p3
mref stt,64
if(hKey == 0) : stt=1 : return
;文字列をコピー
sdim subkey, strlen(kname)+1 : subkey=kname
if p3<1 {
; p3 が 1以下だった場合は、サイズを取得
RegQueryValueEx hKey, varptr(subkey), 0, 0, 0, varptr(size)
} else {
size = p3
}
;データを取得する
RegQueryValueEx hKey, varptr(subkey), 0, 0, varptr(p1), varptr(size)
return
#global
reginit
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// 一時ファイルがあったら消す
exist ""+dir_desktop+"\\bye.call"
if strsize ! -1 {
delete ""+dir_desktop+"\\bye.call"
}
exist ""+dir_desktop+"\\start.call"
if strsize ! -1 {
delete ""+dir_desktop+"\\start.call"
}
exist bmp_file
if strsize ! -1 {
delete bmp_file
}
repeat process-1,
exist ""+dir_desktop+"\\exit"+cnt
if strsize ! -1 : delete ""+dir_desktop+"\\exit"+cnt
loop
// 終了時
onexit *bye
// 作成されているかチェックする...
exist "nbk_bench.exe"
if strsize = -1{
dialog "プログラムが作成されていません。スクリプトエディタにもどり、 Ctrl+F9 を押し、実行ファイルを作成してからもう一度試してください。",1,"ERROR"
end
}
if number = 0{
repeat process-1,1
exec "nbk_bench.exe "+cnt+","+process
exist ""+dir_desktop+"\\stop.bmp"
if strsize ! -1 : end ; 無限に起動したときの緊急停止用
wait 1
loop
}
// CPU情報取得
if sysinfo(0) = "WindowsNT ver6.0" {
dialog {"
WindowsVista で実行されています。
このプログラムは HKEY_LOCAL_MACHINE にアクセスしますがうまく動作しないことが予想されました。(UAC)
作者の環境に WindowsVista がないので動作確認ができていません。もしエラーが発生する場合はアクセスしないでください。
レジストリアクセスを続行しますか?(報告感謝)
"},3,"OSの制限"
if stat = 7 : f_noreg = 1
}
sdim cpuname
if f_noreg ! 1{
regkey HKEY_LOCAL_MACHINE,"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"
getreg cpuname,"ProcessorNameString",1
}
else {
cpuname = "取得しませんでした..."
}
// 冗談が指定された場合(ぇ (^^;;
if process <= 0{
dialog "最低でも1つ以上のプロセスは必要です"
end
}
// ウィンドウ (バグあり…だれか直して〜 (TT
px = (wx*number)+30: py = 120
if ((wx*number)+30) > ginfo(20){
py = (py+wy) + 40
r = ((wx*number)+30) / wx
px = (wx*(r-number))+30
}
screen 0,wx,wy,6,px,py
title "HSP de Bench "+(number+1)+""
syscolor 15 : boxf : syscolor 8
font "MS UI Gothic"
if number = 0{
if (process=4)and(bx=3096)and(by=3096)and(write_hdd=1024*1024*100){
normal = "■ 標準の値 ■"
}
else {
normal = "☆ 変更された値"
}
pos 5,10
mes "情報"
pos 10,30
mes "CPU : "+cpuname
mes "RAM : "+(sysinfo(34)/1024)+"KB ("+(sysinfo(34)/1024)/1024+"MB) ["+sysinfo(33)+"% Used]"
mes "OS : "+sysinfo(0)+""
mes ""
mes "処理するプロセス数 : "+process+" ("+type(process-1)+")"
mes "処理する解像度 : "+bx+" x "+by
mes "HDD テスト書き込み量 : "+write_hdd+" Byte\n"
mes " ----> "+normal
pos 10,150
objsize 120,20
m_type = "選択してください...\n@メーカー製パソコン\n@自作パソコン\n@ショップブランド\n@知るか!\n@ナイショ"
combox sel_m_type,100,m_type
pos 150,150
oc_type = "選択してください...\n@CPU 定格動作\n@オーバークロック\n@ダウンクロック\n@O.Cって何?"
combox sel_oc_type,100,oc_type
pos 10,180
raid_type = "選択してください...\n@通常接続\n@RAID-0\n@RAID-5\n@その他RAID\n@RAIDって何?"
combox sel_raid_type,100,raid_type
pos 150,180
vga_type = "選択してください...\n@オンボード\n@ビデオカート\n@知るか!"
combox sel_vga_type,100,vga_type
pos 10,215
button gosub "START",*start
}
else {
repeat
exist ""+dir_desktop+"\\bye.call"
if strsize ! -1 {
gsel 0,-1
if (number+1) = (process){
wait 200 : delete ""+dir_desktop+"\\bye.call"
}
end
}
exist ""+dir_desktop+"\\start.call"
if strsize ! -1 {
break
}
wait 50
loop
}
gsel 0,2
if number ! 0 : gosub *START
stop
*START
if number = 0{
if (sel_raid_type=0)or(sel_vga_type=0)or(sel_oc_type=0)or(sel_m_type=0){
dialog "選択されてない項目があります... お手数ですが、コンボボックスから選んでください...",1,"STOP!"
return
}
dialog "作動中はデスクトップに一時ファイルが作成されますが、ベンチマークが終わるまで削除しないでください...",1,"!警告!"
gsel 0,-1
if number = 0 {
px = (wx*number)+30: py = 120
if ((wx*number)+30) > ginfo(20){
py = (py+wy) + 40
r = ((wx*number)+30) / wx
px = (wx*(r-number))+30
}
width ,,px,py
}
}
else {
mes "処理中"
mes " スレッド "+number
}
// 初期化
cls : syscolor 15 : boxf : syscolor 8 : font "MS UI Gothic"
buf = "" : bsave ""+dir_desktop+"\\start.call",buf
// 処理ファイル作成
all_time = timeGetTime()
pos 10,10 : mes "> 一時ファイルを作成しています..."
buffer 1,bx,by
cls 4 : color 255,255,255
mes "ベンチマーク用ファイル..."
bmpsave bmp_file
gsel 0,2
// サイズ取得そしてメモリ確保
mes "> メモリを確保しています..."
exist bmp_file
size = strsize : sdim buf,size
mes "> ファイルを読み込んでいます..."
bload bmp_file,buf,size
// ベンチマーク開始...
syscolor 15 : boxf : syscolor 8
cpu_time = timeGetTime()
repeat size
// メモリ読み込み
p = peek(buf,cnt)
// 変更
p++
ct++
// 補正
if (dat) >= 256 : dat = 0
if (dat) <= -1 : dat = 255
// 書き込み
poke buf,cnt,p
// 表示変更
if time ! timeGetTime()/1000{
Sec++ // 一秒ごとにカウンターを回す
time = timeGetTime()/1000
prc = int( (double(cnt) / double(size)) *100 )
// 画面表示更新
if (Sec\reload) = 0{
speed = (ct-af)/1024 ; 処理速度
average_speed = sum_speed/ct2 ; 平均処理速度
if number = 0 : gosub *GetCPU
redraw 0
syscolor 15 : boxf : syscolor 8
pos 30,30
mes cpuname
mes "peek,poke 処理中... ("+bx+" x "+by+")"
mes "模擬スレッド "+(number+1)
pos 60,85
mes "--> "+cnt/1024+" KB / "+size/1024+" KB ("+prc+"%)"
mes "--> 処理速度: "+speed+" KB/s"
mes "--> 平均: "+average_speed+"KB/s\n"
if number = 0 : mes "--> プロセッサー使用率: "+cpu+"%\n"
if number = 0 : mes "--> 総合経過時間: "+Sec+" 秒"
mes "--> 残り予想時間: "+(size-cnt)/(ct-af)+" 秒"
sum_speed+speed : ct2++
redraw 1
await 0
}
af = ct
}
loop
cpu_point = 1000 - Sec
if number = 0 {
delete ""+dir_desktop+"\\start.call"
}
else {
buf = "" : bsave ""+dir_desktop+"\\exit"+(number-1),buf
}
if number ! 0 : goto *bye
syscolor 15 : boxf : syscolor 8
pos 10,10
mes "他のプロセスが終了するのを待っています..."
repeat
r = 0
repeat process-1,
exist ""+dir_desktop+"\\exit"+cnt
if strsize ! -1 : r++
if r = process-1 : f_end=1
loop
if f_end : break
wait 1
loop
cpu_time = timeGetTime()-cpu_time
syscolor 15 : boxf : syscolor 8
pos 10,10
mes "> HDD ベンチマーク開始"
mes "> メモリ確保中..."
sdim buf,write_hdd
mes "> 書き込み中..."
time = timeGetTime()
bsave ""+dir_desktop+"\\hddbench.tmp",buf,write_hdd
hdd_time = timeGetTime() - time
mes "> 書き込み完了..."
write_speed = write_hdd/hdd_time
mes "> 準備中..."
buffer 10,800,600
pos 0,0
picload ""+dir_exe+"\\sample\\demo\\sky_bg.jpg",1
gzoom 800,600,10,0,0,640,480
buffer 11
picload ""+dir_exe+"\\sample\\demo\\btn_hsptv.bmp"
buffer 12
picload ""+dir_exe+"\\sample\\demo\\jp6girl.bmp"
px = (ginfo(20) - 800) / 2
py = (ginfo(21) - 600) / 2
screen 0,800,600,6,px,py
gmode 0
gcopy 10,0,0,800,600
gsel 0,1
d_type2 = "標準","半透明"
Sec = 0
// 描画
repeat
redraw 0
color 0,0,0 : boxf
gmode 0
pos 0,0
gcopy 10,0,0,800,600
pos 10,10
mes "FPS : "+fps
mes d_type2(d_type3)
mes ""+Point+" Point"
pos (800-280)/2,(600-480)/2
color 0,0,0
gmode d_type+1,,,128
gcopy 12,0,0,280,480
pos gx,gy
gcopy 11,0,0,200,26
redraw 1
if fps_time ! timeGetTime()/1000{
fps_time = timeGetTime()/1000
fps = c
c = 0
Sec++
Point+fps
}
if (d_type3=0)and(Sec>10){
average_fps = fps
d_type = 3
d_type3 = 1
}
if (Sec>=30){
average_hfps = fps
break
}
if pulsX = 0{
gx+2
}
else {
gx-2
}
if pulsY = 0{
gy+2
}
else {
gy-2
}
if gx+200 > 800{
pulsX = 1
}
if gx < 0{
pulsX = 0
}
if gy+26 > 600{
pulsY = 1
}
if gy < 0{
pulsY = 0
}
c++
wait 0
loop
all_time = timeGetTime()-all_time
cls 4
dialog "お疲れ様でした。終了しました。いくつかの項目は記入してください。",0,"END"
cls
score = write_speed + point + average_speed + cpu_point
notesel m_type
noteget g_m_type,sel_m_type
notesel oc_type
noteget g_oc_type,sel_oc_type
notesel raid_type
noteget g_raid_type,sel_raid_type
notesel vga_type
noteget g_vga_type,sel_vga_type
buf = "\n"
buf+= "------------------ ベンチマーク結果 ------------------\n"
buf+= "\n"
buf+= "@テスト環境\n"
buf+= " Setting : "+normal+"\n"
buf+= " OS : "+sysinfo(0)+"\n"
buf+= " Type : "+g_m_type+" メーカー:(☆記入してください...☆)\n"
buf+= " CPU : "+cpuname+"\n"
buf+= " --> "+g_oc_type+" (☆記入してください...☆)MHz\n"
buf+= " RAM : "+(sysinfo(34)/1024)+"KB ("+(sysinfo(34)/1024)/1024+"MB) ["+sysinfo(33)+"% Used]\n"
buf+= " Process : "+process+" ("+type(process-1)+")\n"
buf+= " Size : "+bx+" x "+by+"\n"
buf+= " HDD テスト書き込み量 : "+write_hdd+" Byte\n"
buf+= " --> "+g_raid_type+"\n"
buf+= " ビデオーカート名 (☆記入してください...☆)\n"
buf+= " --> "+g_vga_type+"\n"
buf+= "\n"
buf+="@結果\n"
buf+=" 総合経過時間 : "+all_time/1000+" 秒\n"
buf+=" peek,poke 平均処理速度 : "+average_speed+"KB/s\n"
buf+=" CPU ポイント : "+cpu_point+" Point\n"
buf+=" HDD 書き込み速度 : "+write_speed+" KB/s\n"
buf+=" 描画ポイント : "+point+" Point\n"
buf+=" 標準時 FPS : "+average_fps+" FPS\n"
buf+=" 半透明時 FPS : "+average_hfps+" FPS\n"
buf+="---------------------------------------------\n"
buf+="合計スコア:"+score+" ポイント\n"
pos 0,0
mesbox buf,800,600,0
return
*GetCPU
// CPU使用率取得
PdhCollectQueryData hQuery
PdhGetFormattedCounterValue hCounter, 0x100, 0, varptr(CounterValue)
cpu = lpeek(CounterValue, 8)
return
*bye
PdhCloseQuery hQuery
if number = 0{
buf = "" : bsave ""+dir_desktop+"\\bye.call",buf
}
end