改めて処理時間を測ってみた。実用にはまったく問題ないけど、この差はなんだろう。
改めて処理時間を測ってみた。実用にはまったく問題ないけど、この差はなんだろう。
/*// c4hsp で使ったCのソースコード
int func(unsigned char *str) {
unsigned char *p = str;
while ( *( p++ ) );
return (p - str -1);
}
#define OPT maximum // disable, small, fast, maximum (不使用, 最小化, 速度, 最大限の最適化)
#define LINE 8
#define VECTORTYPE ()
#define MODULE mod_strlen2
#define FUNC strlen2
*/
// c4hsp で出力した機械語モジュール
#ifndef strlen2
#module mod_strlen2
#uselib "kernel32.dll"
#func VirtualAllocmod_strlen2 "VirtualAlloc" int, int, int, int
#func VirtualFreemod_strlen2 "VirtualFree" int, int, int
#define NULL 0x00000000
#define PAGE_EXECUTE_READWRITE 0x00000040
#define MEM_COMMIT 0x00001000
#define MEM_RESERVE 0x00002000
#define MEM_DECOMMIT 0x00004000
#define MEM_RELEASE 0x00008000
#deffunc mod_strlen2_destructor onexit
if(NULL != strlen2_ptr) {
VirtualFreemod_strlen2 strlen2_ptr, 20, MEM_DECOMMIT
VirtualFreemod_strlen2 strlen2_ptr, 0, MEM_RELEASE
strlen2_ptr = NULL
}
return
#deffunc mod_strlen2_constructor
mod_strlen2_destructor
VirtualAllocmod_strlen2 NULL, 20, MEM_RESERVE, PAGE_EXECUTE_READWRITE
VirtualAllocmod_strlen2 stat, 20, MEM_COMMIT, PAGE_EXECUTE_READWRITE
strlen2_ptr = stat
dupptr strlen2_bin, stat, 20, vartype("int")
strlen2_bin(0) = $04244C8B, $108AC18B, $75D28440, $48C12BF9, $000000C3
return
// マクロだったのを関数化した
#defcfunc strlen2 var s
prm@mod_strlen2 = varptr(s)
return callfunc(prm@mod_strlen2, strlen2_ptr@mod_strlen2, 1)
#global
mod_strlen2_constructor
#endif
#include "winmm.as"
// 適当にテキスト作成
mes "文字列作成中...\n"
size = 1024 * 1024 * 100 ; 100MB
sdim a, size + 1
memset a, 'a', size
// 計測
max = 10 ; 10 回繰り返す。size * max で 1000MB相当
mes "strlen 計測中..."
timeGetTime :time1 = stat
repeat max
l1 = strlen(a)
loop
timeGetTime :mes "所要時間:" + (stat - time1) + "ms" + ", 取得値:" + l1 + "byte"
mes "strlen2 計測中..."
timeGetTime :time1 = stat
repeat max
l2 = strlen2(a)
loop
timeGetTime :mes "所要時間:" + (stat - time1) + "ms" + ", 取得値:" + l2 + "byte"