改めて処理時間を測ってみた。実用にはまったく問題ないけど、この差はなんだろう。
改めて処理時間を測ってみた。実用にはまったく問題ないけど、この差はなんだろう。
/*// 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"