* kharcs #6 -(by [[K]], 2025.07.21) ** (0) これはなに? -(kharcsページは、kharc開発でわかったことを整理して説明するためのページ群です。) -今回説明したいこと: kccに300行ほど書き足したら、OSECPU-VMよりも高密度でOSECPU-VMよりも高速実行できる、VM実行環境ができてしまった?! --今調べたら、OSECPU-VMでは高密度バイトコードをほどくだけの decode.c だけでも、2800行ある・・・。 --何なのこの違い・・・。 ** (1) -どのくらい高密度? |mandel|RIGHT:91バイト|OSECPU-VMでは109バイト| |3dwave|RIGHT:128バイト|比較対象なし| |kcube|RIGHT:421バイト|OSASK版では1393バイト| -どのくらい高速?(mandelで比較) |uck(ultra-compact-kharc) mod=3(x86 JITコンパイラ)|RIGHT:11.3秒|RIGHT:1.00倍| |uck mod=1(CPUに依存しないバイトコードインタプリタ)|RIGHT:187.4秒|RIGHT:16.5倍| |OSECPU-VM|RIGHT:689秒|RIGHT:60.9倍| ---なぜOSECPU-VMがこんなに遅いのか調べたら、hh4をデコードしながら実行してたのか・・・。それは遅くなるよ・・・。 -このプログラムが91バイトになりました(mandel): #include "kharc.h" int main() void main() { int w, x, y; w = openWin(1024, 768); for (y = 0; y < 768; y++) { for (x = 0; x < 1024; x++) { int sn, sx, sy, n, c, cx, cy, zx, zy, xx, yy; sn = 0; for (sx = 0; sx < 4; sx++) { cx = (x * 4 + sx) * 28 + 4673536; for (sy = 0; sy < 4; sy++) { cy = (y * 4 + sy) * 28 + 124928; zx = zy = 0; for (n = 0; n < 447; n++) { xx = (zx * zy) >> 24; // ここは64bit計算が必要. yy = (zy * zy) >> 24; // ここは64bit計算が必要. if (xx + yy > 0x4000000) break; zy = (zx * zy) > 23; // ここは64bit計算が必要. zy = zy - cy; zx = xx + cx - yy; } sn = sn + n; } } n = sn >> 4; c = n * 0x100; if (n >= 256) { c = 0; if (n < 447) { c = 0xfe01 - n; } } setPix(w, x, y, c * 0x100); } } wait(-1); } -(以下編集中)