* 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);
 }


-(以下編集中)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS