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"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX