a21_txt02_10a
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 「10日くらいでできる!プログラミング言語自作入門」の続...
-(by [[K]], 2021.05.12)
** (1) HL-20a
-HL-20は期待通りに速くなってくれて大変うれしいのですが、...
>regVar(0, i)
>codedump 1
(len=0)
>run hl3.txt
48 8b 85 18 00 00 00 48 89 c3 48 8b c3 48 ff c0 48 89 c3...
(len=39)
-これは、1億回ループのプログラムをcodedump 1の状態でrunし...
48 8b 85 18 00 00 00; // RAX = 0;
48 89 c3; // RBX = RAX;
label:
48 8b c3; // RAX = RBX;
48 ff c0; // RAX++;
48 89 c3; // RBX = RAX;
48 3b 85 e0 02 00 00; // if (RAX < 1億) goto label;
0f 8c ea ff ff ff;
48 ff 95 78 01 00 00; // call sub_time
-まあこれは、HL-20のアルゴリズムを考えれば、こうなって当...
-どこが低品質なのかというと、RBXレジスタを使っているにも...
-理想を考えると以下のようになります。
48 8b 9d 18 00 00 00; // RBX = 0;
label:
48 ff c3; // RBX++;
48 3b 9d e0 02 00 00; // if (RBX < 1億) goto label;
0f 8c f0 ff ff ff;
48 ff 95 78 01 00 00; // call sub_time
-普通ならこのようにRBXをRBXのままで演算すべきなのです。こ...
----
-ここまでは、私もわかっていました。それこそ何年も前から分...
-でもようやく、これを簡単に書く方法を思いつきました。だか...
----
-HL-14の段階では、加算の二項演算子はこうなっています(opB...
%R_8b_%1m0; %R_03_%2m0; %R_89_%0m0;
-これをHL-14aでは以下のようにします。
%1L0; %R_03_&8:%2m0; %0S;
-これの意味を説明します。
-まず最初の「%1L0;」ですが、これは基本的には「%R_8b_%1m0;...
-次に「&48:」という記述が新しいです。これはプリフィクス(...
--最初の数字4は、もしrが8以上だったら、REXのところに4を加...
--次の数字8は、r*8を次の命令出力時に加算せよ、という指示...
-最後の「%0S;」は、もしr=0だったら、「%R_89_%0m0;」と同じ...
-では、%0と%1が同じ変数を指していて、しかもレジスタ変数だ...
-RBXなので、r=3になります。%1L0と%0Sは何も出力しません。...
%R_03_%2m3;
-に相当する機械語だけが出てくることになるのです。おお、こ...
-もし%0と%1のどちらもレジスタ変数だけど、でも同じ変数では...
RBX = RSI + %2;
-みたいな状態だったら、いつも通りのRAX経由の計算になりま...
RAX = RSI;
RAX += %2;
RBX = RAX;
-これはまだだめじゃないかと思うかもしれません。まあその通...
----
-と思ったけど、これを書いて説明しているうちに何とかなりそ...
%1L02; %R_03_&48:%2m0; %0S;
-こう書かせることにします。それで、%1L02では%1と%0だけを...
--(1)%0と%1がレジスタ変数で、しかも同一変数であれば、%1L0...
--(2)上記以外で、%0がレジスタ変数であれば、%2が%0と等しい...
--(3)上記のどちらでもなければ、r=0として、従来通りRAX=%1;...
-これで余計なRAX経由の計算は最小限にできそうです!
// zx = xx + cx; に効いたらしい。
----
-[1]opBin[]を以下の記述に差し替え
String opBin[] = { // 二項演算子のための機械語.
! "%1L11; %R_3b_&48:%2m0; 0f_94_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_95_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9c_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9d_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9e_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9f_c0; 0f_b6_c0; %R_89_%0...
! "%1L02; %R_03_&48:%2m0; %0S;", ...
! "%1L02; %R_2b_&48:%2m0; %0S;", ...
! "%1L02; %R_0f_af_&48:%2m0; %0S;", ...
"%R_8b_%1m0; %R_99; %R_f7_%2m7; %R_89_%0m0;", ...
"%R_8b_%1m0; %R_99; %R_f7_%2m7; %R_89_%0m2;", ...
! "%1L02; %R_23_&48:%2m0; %0S;", ...
! "%1L02; %R_8b_%2m1; %R_d3_&11:f8; %0S;" ...
};
-[2]putIcX64_sub()関数に書き足し&変更
void putIcX64_sub(String s, IntP a[])
{
int i, j, k;
+ unsigned char addVal = 0, r = 0;
for (i = 0; s[i] != 0; ) {
! if (s[i] == ' ' || s[i] == '\t' || s[i] == '_' |...
i++;
} else if (getHex(s[i]) >= 0 && getHex(s[i + 1])...
! *icq = getHex(s[i]) * 16 + getHex(s[i + 1]) ...
i += 2;
icq++;
+ addVal = 0;
+ } else if (s[i] == '&') {
+ if (r >= 8) {
+ *putIcX64_rex += s[i + 1] - '0';
+ }
+ addVal = (r & 7) * (s[i + 2] - '0');
+ i += 3;
} else if (s[i] == '%') {
if (s[i + 1] == 'R') {
putIcX64_rex = icq;
*icq = 0x48;
icq++;
i += 2;
continue;
}
j = s[i + 1] - '0';
if (s[i + 2] == 'm') { // mod r/m.
k = s[i + 3] - '0';
if (s[i + 3] >= 'a') { // もしかしたらこ...
k = s[i + 3] - 'a' + 10;
}
+ i += 4;
+subcmd_m:
if (k >= 8) {
*putIcX64_rex += 4;
k -= 8;
}
int rv = regVar(a[j]);
if (rv < 0) {
! *icq = 0x85 + k * 8 + addVal;
put32(icq + 1, (a[j] - var) * 8);
icq += 5;
} else {
rv = regVarNo[rv];
if (rv >= 8) {
*putIcX64_rex += 1;
rv -= 8;
}
! *icq = 0xc0 + rv + k * 8 + addVal;
icq++;
}
+ addVal = 0;
continue;
}
+ if (s[i + 2] == 'L') {
+ int l = s[i + 4] - '0';
+ k = s[i + 3] - '0';
+ i += 5;
+ if (regVar(a[j]) >= 0 && a[j] == a[k]) {
+ r = regVarNo[regVar(a[j])];
+ } else if (regVar(a[k]) >= 0 && a[k] != ...
+ k = r = regVarNo[regVar(a[k])];
+ icq[0] = 0x48;
+ icq[1] = 0x8b;
+ putIcX64_rex = icq;
+ icq += 2;
+ goto subcmd_m;
+ } else {
+ k = r = 0; // RAX.;
+ icq[0] = 0x48;
+ icq[1] = 0x8b;
+ putIcX64_rex = icq;
+ icq += 2;
+ goto subcmd_m;
+ }
+ continue;
+ }
+ if (s[i + 2] == 'S') {
+ if (r == 0) {
+ k = 0;
+ icq[0] = 0x48;
+ icq[1] = 0x89;
+ putIcX64_rex = icq;
+ icq += 2;
+ i += 3;
+ goto subcmd_m;
+ }
+ }
if (s[i + 2] == 'i') { // int.
put32(icq, (int) a[j]);
icq += 4;
}
(中略)
} else {
printf("putIcX64: error: '%s'(%s)\n", s, &s[...
exit(1);
}
}
}
-[3]ifgoto()関数のうちの2行を差し替え
void ifgoto(int i, int not, int label)
{
int j = wpc[i];
if (j + 3 == wpc1[i] && TcEEq <= tc[j + 1] && tc[j +...
! putIcX64("%2L22; %R_3b_&48:%3m0; 0f_%0c_%1l;", (...
} else {
i = expr(i);
! putIcX64("%2L22; %R_85_&59:c0; 0f_%0c_%1l;", (In...
tmpFree(i);
}
}
-[3]phrCmpPutIcX86()関数の一部を差し替え(1)
for (i = 4; i < lenExpr; i++) {
! putIcX64("%0L00; %R_89_&48:44_24_%1c;", ...
}
-[4]phrCmpPutIcX86()関数の一部を差し替え(2)
for (i = 6; i < lenExpr; i++) {
! putIcX64("%0L00; %R_89_&48:44_24_%1c;", ...
}
-[5]compile()関数の一部を差し替え(1)
if (phrCmp( 1, "!!*0 = !!*1;", pc)) { // 単純代入.
+ if (regVar(&var[tc[wpc[0]]]) < 0) {
! putIcX64("%1L11; %R_89_&48:%0m0;", &var[...
+ } else {
+ putIcX64("%0L00; %R_8b_&48:%1m0;", &var[...
+ }
} else if (phrCmp(10, "!!*0 = !!*1 + 1; if (!!*2...
! putIcX64("%1L11; %R_ff_&11:c0; %1S; %R_3b_&4...
} else if (phrCmp( 9, "!!*0 = !!*1 + 1;", pc) &&...
! putIcX64("%0L00; %R_ff_&11:c0; %0S;", &var[t...
-[6]compile()関数の一部を差し替え(2)
} else if (phrCmp(15, "}", pc) && binf[bd] == Bl...
defLabel(binf[bd + ForCont]); // ラベルに対...
i = binf[bd + ForWpc01];
j = binf[bd + ForWpc02];
if (i + 3 == binf[bd + ForWpc11] && j + 2 ==...
// !!***1が「i < ?」かつ、!!***2が「i++...
! putIcX64("%1L11; %R_ff_&11:c0; %1S; %R_3...
} else {
wpc [1] = binf[bd + ForWpc01];
wpc1[1] = binf[bd + ForWpc11];
wpc [2] = binf[bd + ForWpc02];
wpc1[2] = binf[bd + ForWpc12];
e2 = expr(2);
if (wpc[1] < wpc1[1]) { // !!***1に何ら...
ifgoto(1, 0, binf[bd + ForLopBgn]);
} else {
putIcX64("e9_%0l;", &var[binf[bd + F...
}
}
defLabel(binf[bd + ForBrk]); // ラベルに対応...
lbd = binf[bd+ ForLbd0]; // 以前の値を復元.
bd -= BInfSiz;
-[7]compile()関数に2行を追加
+ } else if (phrCmp(38, "!!*3 = mul64shr(!!*0, !!*...
+ putIcX64("%0L31; %R_0f_af_&48:%1m0; %R_c1_&1...
----
-以上すべての改造を終えると、プログラムは1014行になります。
** (2) プログラムの説明
-ここでプログラムの説明を書こうと思ったのですが、もう大体...
-だからもう些末なことしかのこっていないのですが、mul64shr...
-この特別処理を書くことによって、演算結果をいったん一時変...
** (3) 効果の確認
-まずはhl3.txtのコンパイル結果を確認してみます。
>regVar(0, i)
>codedump 1
(len=0)
>run hl3.txt
48 8b 9d 18 00 00 00 48 ff c3 48 3b 9d e0 02 00 00 0f 8c...
(len=30)
-このコードを見やすい形で書き直すとこうなります。
48 8b 9d 18 00 00 00; // RBX = 0;
label:
48 ff c3; // RBX++;
48 3b 9d e0 02 00 00; // if (RBX < 1億) goto label;
0f 8c f0 ff ff ff;
48 ff 95 78 01 00 00; // call time;
-おお、これはまさに上記の「理想形」です。とてもうまくいっ...
-肝心の実行速度も確認しました。
|ページ名|名前|行数|.exeの大きさ|説明|速度のめやす1|速度...
|[ [[a21_txt01]] ]|HL-1~HL-9a|RIGHT:49行~772行|RIGHT:6....
|[[a21_txt02_7]]|HL-17|RIGHT:741行|RIGHT:25.0KB|x64に対応...
|[[a21_txt02_7a]]|HL-17a|RIGHT:756行|RIGHT:26.0KB|簡単な...
|[[a21_txt02_8]]|HL-18|RIGHT:795行|RIGHT:27.0KB|ループ速...
|[[a21_txt02_8a]]|HL-18a|RIGHT:816行|RIGHT:27.5KB|codedum...
|[[a21_txt02_9]]|HL-19|RIGHT:893行|RIGHT:35.5KB|配列以外...
|[[a21_txt02_9a]]|HL-19a|RIGHT:899行|RIGHT:36.0KB|配列もJ...
|[[a21_txt02_10]]|HL-20|RIGHT:964行|RIGHT:36.0KB|レジスタ...
|[[a21_txt02_10a]]|HL-20a|RIGHT:1014行|RIGHT:37.0KB|レジ...
-あれ?10億回ループは速くなっていませんね・・・。
-ということでHL-20bでそれを解決します。
** 次回に続く
-次回: [[a21_txt02_10b]]
*こめんと欄
#comment
終了行:
* 「10日くらいでできる!プログラミング言語自作入門」の続...
-(by [[K]], 2021.05.12)
** (1) HL-20a
-HL-20は期待通りに速くなってくれて大変うれしいのですが、...
>regVar(0, i)
>codedump 1
(len=0)
>run hl3.txt
48 8b 85 18 00 00 00 48 89 c3 48 8b c3 48 ff c0 48 89 c3...
(len=39)
-これは、1億回ループのプログラムをcodedump 1の状態でrunし...
48 8b 85 18 00 00 00; // RAX = 0;
48 89 c3; // RBX = RAX;
label:
48 8b c3; // RAX = RBX;
48 ff c0; // RAX++;
48 89 c3; // RBX = RAX;
48 3b 85 e0 02 00 00; // if (RAX < 1億) goto label;
0f 8c ea ff ff ff;
48 ff 95 78 01 00 00; // call sub_time
-まあこれは、HL-20のアルゴリズムを考えれば、こうなって当...
-どこが低品質なのかというと、RBXレジスタを使っているにも...
-理想を考えると以下のようになります。
48 8b 9d 18 00 00 00; // RBX = 0;
label:
48 ff c3; // RBX++;
48 3b 9d e0 02 00 00; // if (RBX < 1億) goto label;
0f 8c f0 ff ff ff;
48 ff 95 78 01 00 00; // call sub_time
-普通ならこのようにRBXをRBXのままで演算すべきなのです。こ...
----
-ここまでは、私もわかっていました。それこそ何年も前から分...
-でもようやく、これを簡単に書く方法を思いつきました。だか...
----
-HL-14の段階では、加算の二項演算子はこうなっています(opB...
%R_8b_%1m0; %R_03_%2m0; %R_89_%0m0;
-これをHL-14aでは以下のようにします。
%1L0; %R_03_&8:%2m0; %0S;
-これの意味を説明します。
-まず最初の「%1L0;」ですが、これは基本的には「%R_8b_%1m0;...
-次に「&48:」という記述が新しいです。これはプリフィクス(...
--最初の数字4は、もしrが8以上だったら、REXのところに4を加...
--次の数字8は、r*8を次の命令出力時に加算せよ、という指示...
-最後の「%0S;」は、もしr=0だったら、「%R_89_%0m0;」と同じ...
-では、%0と%1が同じ変数を指していて、しかもレジスタ変数だ...
-RBXなので、r=3になります。%1L0と%0Sは何も出力しません。...
%R_03_%2m3;
-に相当する機械語だけが出てくることになるのです。おお、こ...
-もし%0と%1のどちらもレジスタ変数だけど、でも同じ変数では...
RBX = RSI + %2;
-みたいな状態だったら、いつも通りのRAX経由の計算になりま...
RAX = RSI;
RAX += %2;
RBX = RAX;
-これはまだだめじゃないかと思うかもしれません。まあその通...
----
-と思ったけど、これを書いて説明しているうちに何とかなりそ...
%1L02; %R_03_&48:%2m0; %0S;
-こう書かせることにします。それで、%1L02では%1と%0だけを...
--(1)%0と%1がレジスタ変数で、しかも同一変数であれば、%1L0...
--(2)上記以外で、%0がレジスタ変数であれば、%2が%0と等しい...
--(3)上記のどちらでもなければ、r=0として、従来通りRAX=%1;...
-これで余計なRAX経由の計算は最小限にできそうです!
// zx = xx + cx; に効いたらしい。
----
-[1]opBin[]を以下の記述に差し替え
String opBin[] = { // 二項演算子のための機械語.
! "%1L11; %R_3b_&48:%2m0; 0f_94_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_95_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9c_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9d_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9e_c0; 0f_b6_c0; %R_89_%0...
! "%1L11; %R_3b_&48:%2m0; 0f_9f_c0; 0f_b6_c0; %R_89_%0...
! "%1L02; %R_03_&48:%2m0; %0S;", ...
! "%1L02; %R_2b_&48:%2m0; %0S;", ...
! "%1L02; %R_0f_af_&48:%2m0; %0S;", ...
"%R_8b_%1m0; %R_99; %R_f7_%2m7; %R_89_%0m0;", ...
"%R_8b_%1m0; %R_99; %R_f7_%2m7; %R_89_%0m2;", ...
! "%1L02; %R_23_&48:%2m0; %0S;", ...
! "%1L02; %R_8b_%2m1; %R_d3_&11:f8; %0S;" ...
};
-[2]putIcX64_sub()関数に書き足し&変更
void putIcX64_sub(String s, IntP a[])
{
int i, j, k;
+ unsigned char addVal = 0, r = 0;
for (i = 0; s[i] != 0; ) {
! if (s[i] == ' ' || s[i] == '\t' || s[i] == '_' |...
i++;
} else if (getHex(s[i]) >= 0 && getHex(s[i + 1])...
! *icq = getHex(s[i]) * 16 + getHex(s[i + 1]) ...
i += 2;
icq++;
+ addVal = 0;
+ } else if (s[i] == '&') {
+ if (r >= 8) {
+ *putIcX64_rex += s[i + 1] - '0';
+ }
+ addVal = (r & 7) * (s[i + 2] - '0');
+ i += 3;
} else if (s[i] == '%') {
if (s[i + 1] == 'R') {
putIcX64_rex = icq;
*icq = 0x48;
icq++;
i += 2;
continue;
}
j = s[i + 1] - '0';
if (s[i + 2] == 'm') { // mod r/m.
k = s[i + 3] - '0';
if (s[i + 3] >= 'a') { // もしかしたらこ...
k = s[i + 3] - 'a' + 10;
}
+ i += 4;
+subcmd_m:
if (k >= 8) {
*putIcX64_rex += 4;
k -= 8;
}
int rv = regVar(a[j]);
if (rv < 0) {
! *icq = 0x85 + k * 8 + addVal;
put32(icq + 1, (a[j] - var) * 8);
icq += 5;
} else {
rv = regVarNo[rv];
if (rv >= 8) {
*putIcX64_rex += 1;
rv -= 8;
}
! *icq = 0xc0 + rv + k * 8 + addVal;
icq++;
}
+ addVal = 0;
continue;
}
+ if (s[i + 2] == 'L') {
+ int l = s[i + 4] - '0';
+ k = s[i + 3] - '0';
+ i += 5;
+ if (regVar(a[j]) >= 0 && a[j] == a[k]) {
+ r = regVarNo[regVar(a[j])];
+ } else if (regVar(a[k]) >= 0 && a[k] != ...
+ k = r = regVarNo[regVar(a[k])];
+ icq[0] = 0x48;
+ icq[1] = 0x8b;
+ putIcX64_rex = icq;
+ icq += 2;
+ goto subcmd_m;
+ } else {
+ k = r = 0; // RAX.;
+ icq[0] = 0x48;
+ icq[1] = 0x8b;
+ putIcX64_rex = icq;
+ icq += 2;
+ goto subcmd_m;
+ }
+ continue;
+ }
+ if (s[i + 2] == 'S') {
+ if (r == 0) {
+ k = 0;
+ icq[0] = 0x48;
+ icq[1] = 0x89;
+ putIcX64_rex = icq;
+ icq += 2;
+ i += 3;
+ goto subcmd_m;
+ }
+ }
if (s[i + 2] == 'i') { // int.
put32(icq, (int) a[j]);
icq += 4;
}
(中略)
} else {
printf("putIcX64: error: '%s'(%s)\n", s, &s[...
exit(1);
}
}
}
-[3]ifgoto()関数のうちの2行を差し替え
void ifgoto(int i, int not, int label)
{
int j = wpc[i];
if (j + 3 == wpc1[i] && TcEEq <= tc[j + 1] && tc[j +...
! putIcX64("%2L22; %R_3b_&48:%3m0; 0f_%0c_%1l;", (...
} else {
i = expr(i);
! putIcX64("%2L22; %R_85_&59:c0; 0f_%0c_%1l;", (In...
tmpFree(i);
}
}
-[3]phrCmpPutIcX86()関数の一部を差し替え(1)
for (i = 4; i < lenExpr; i++) {
! putIcX64("%0L00; %R_89_&48:44_24_%1c;", ...
}
-[4]phrCmpPutIcX86()関数の一部を差し替え(2)
for (i = 6; i < lenExpr; i++) {
! putIcX64("%0L00; %R_89_&48:44_24_%1c;", ...
}
-[5]compile()関数の一部を差し替え(1)
if (phrCmp( 1, "!!*0 = !!*1;", pc)) { // 単純代入.
+ if (regVar(&var[tc[wpc[0]]]) < 0) {
! putIcX64("%1L11; %R_89_&48:%0m0;", &var[...
+ } else {
+ putIcX64("%0L00; %R_8b_&48:%1m0;", &var[...
+ }
} else if (phrCmp(10, "!!*0 = !!*1 + 1; if (!!*2...
! putIcX64("%1L11; %R_ff_&11:c0; %1S; %R_3b_&4...
} else if (phrCmp( 9, "!!*0 = !!*1 + 1;", pc) &&...
! putIcX64("%0L00; %R_ff_&11:c0; %0S;", &var[t...
-[6]compile()関数の一部を差し替え(2)
} else if (phrCmp(15, "}", pc) && binf[bd] == Bl...
defLabel(binf[bd + ForCont]); // ラベルに対...
i = binf[bd + ForWpc01];
j = binf[bd + ForWpc02];
if (i + 3 == binf[bd + ForWpc11] && j + 2 ==...
// !!***1が「i < ?」かつ、!!***2が「i++...
! putIcX64("%1L11; %R_ff_&11:c0; %1S; %R_3...
} else {
wpc [1] = binf[bd + ForWpc01];
wpc1[1] = binf[bd + ForWpc11];
wpc [2] = binf[bd + ForWpc02];
wpc1[2] = binf[bd + ForWpc12];
e2 = expr(2);
if (wpc[1] < wpc1[1]) { // !!***1に何ら...
ifgoto(1, 0, binf[bd + ForLopBgn]);
} else {
putIcX64("e9_%0l;", &var[binf[bd + F...
}
}
defLabel(binf[bd + ForBrk]); // ラベルに対応...
lbd = binf[bd+ ForLbd0]; // 以前の値を復元.
bd -= BInfSiz;
-[7]compile()関数に2行を追加
+ } else if (phrCmp(38, "!!*3 = mul64shr(!!*0, !!*...
+ putIcX64("%0L31; %R_0f_af_&48:%1m0; %R_c1_&1...
----
-以上すべての改造を終えると、プログラムは1014行になります。
** (2) プログラムの説明
-ここでプログラムの説明を書こうと思ったのですが、もう大体...
-だからもう些末なことしかのこっていないのですが、mul64shr...
-この特別処理を書くことによって、演算結果をいったん一時変...
** (3) 効果の確認
-まずはhl3.txtのコンパイル結果を確認してみます。
>regVar(0, i)
>codedump 1
(len=0)
>run hl3.txt
48 8b 9d 18 00 00 00 48 ff c3 48 3b 9d e0 02 00 00 0f 8c...
(len=30)
-このコードを見やすい形で書き直すとこうなります。
48 8b 9d 18 00 00 00; // RBX = 0;
label:
48 ff c3; // RBX++;
48 3b 9d e0 02 00 00; // if (RBX < 1億) goto label;
0f 8c f0 ff ff ff;
48 ff 95 78 01 00 00; // call time;
-おお、これはまさに上記の「理想形」です。とてもうまくいっ...
-肝心の実行速度も確認しました。
|ページ名|名前|行数|.exeの大きさ|説明|速度のめやす1|速度...
|[ [[a21_txt01]] ]|HL-1~HL-9a|RIGHT:49行~772行|RIGHT:6....
|[[a21_txt02_7]]|HL-17|RIGHT:741行|RIGHT:25.0KB|x64に対応...
|[[a21_txt02_7a]]|HL-17a|RIGHT:756行|RIGHT:26.0KB|簡単な...
|[[a21_txt02_8]]|HL-18|RIGHT:795行|RIGHT:27.0KB|ループ速...
|[[a21_txt02_8a]]|HL-18a|RIGHT:816行|RIGHT:27.5KB|codedum...
|[[a21_txt02_9]]|HL-19|RIGHT:893行|RIGHT:35.5KB|配列以外...
|[[a21_txt02_9a]]|HL-19a|RIGHT:899行|RIGHT:36.0KB|配列もJ...
|[[a21_txt02_10]]|HL-20|RIGHT:964行|RIGHT:36.0KB|レジスタ...
|[[a21_txt02_10a]]|HL-20a|RIGHT:1014行|RIGHT:37.0KB|レジ...
-あれ?10億回ループは速くなっていませんね・・・。
-ということでHL-20bでそれを解決します。
** 次回に続く
-次回: [[a21_txt02_10b]]
*こめんと欄
#comment
ページ名: