c4hspで作ったstrlen的な処理が標準命令より早い

改めて処理時間を測ってみた。実用にはまったく問題ないけど、この差はなんだろう。

改めて処理時間を測ってみた。実用にはまったく問題ないけど、この差はなんだろう。

/*// 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"