| 言語 | 処理時間 | 備考 |
| Python 3.7.4 | 363.172秒 | コードは(9-5) |
| Ruby 2.6.4 | 99.935秒 | コードは(9-6) |
| ES-BASIC (32bit) | 2.998秒 | コードは(9-3)、JITコンパイルに要した時間も含む |
| gcc(C言語)(32bit) | 1.982秒 | コードは(9-2)、もちろん最適化レベル最大、コンパイル時間含まず |
| ES-BASIC (32bit、インラインアセンブラあり) | 1.901秒 | コードは(9-7)、JITコンパイルに要した時間も含む |
| gcc(C言語)(64bit) | 1.195秒 | コードは(9-4)、もちろん最適化レベル最大、コンパイル時間含まず |
#include <stdio.h>
#include <time.h>
#define MAX 447
#define STEP (14.0 / 0x100000)
#define DN 4
int main()
{
int x, y, n, sx, sy, sn, h = 0;
double zx, zy, cx, cy, xx, yy, tx, ty;
for (y = 0; y < 384; y++) {
for (x = 0; x < 512; x++) {
sn = 0;
for (sx = 0; sx < DN; sx++) {
cx = (double) 0x4750 / 0x10000 + (x * DN + sx) * (STEP / DN);
for (sy = 0; sy < DN; sy++) {
cy = (double) 0x1e8 / 0x10000 + (y * DN + sy) * (STEP / DN);
zx = zy = 0;
for (n = 0; n < MAX; n++) {
xx = zx * zx;
yy = zy * zy;
if (xx + yy > 4) break;
tx = xx - yy;
ty = zx * zy * 2;
zx = tx + cx;
zy = ty - cy;
}
sn += n;
}
}
// n = sn / (DN * DN);
n = sn >> 4;
h += n; // 表示の代わりに集計
}
}
printf("%d\n", h);
printf("(%.3f[sec])\n", clock() / (double) CLOCKS_PER_SEC);
return 0;
}1 H=0 2 FOR Y=0,383 3 FOR X=0,511 4 SN=0 5 FOR SX=0,3 6 CX=(X*4+SX)*56+4673536 7 FOR SY=0,3 8 CY=(Y*4+SY)*56+124928 9 ZX=0 10 ZY=0 11 FOR N=0,446 12 XX=ZX*>>ZX,24; // これはZXとZXをIMULで計算して64bitの結果を生成した後で、SHRD命令で24ビット右シフトして下位32bitを結果とする命令 13 YY=ZY*>>ZY,24 14 T=XX+YY 15 IF T>0X4000000 GOTO SKIP 16 ZY=ZX*>>ZY,24 17 ZX=XX-YY+CX 18 ZY=ZY*2-CY 19 NEXT 20 LABEL SKIP 21 SN=SN+N 22 NEXT 23 NEXT 24 N=SN>>4; // N=SN/16 (N=0...447) 25 H=H+N; // 表示の代わりに集計 26 NEXT 27 NEXT 28 PRINT H
#include <stdio.h>
#include <time.h>
#define MAX 447
#define DN 4
int main()
{
long long x, y, sx, sy, zx, zy, cx, cy, xx, yy;
int n, sn, h = 0;
for (y = 0; y < 384; y++) {
for (x = 0; x < 512; x++) {
sn = 0;
for (sx = 0; sx < DN; sx++) {
cx = (x * 4 + sx) * 56 + 4673536;
for (sy = 0; sy < DN; sy++) {
cy = (y * 4 + sy) * 56 + 124928;
zx = zy = 0;
for (n = 0; n < MAX; n++) {
xx = (zx * zx) >> 24;
yy = (zy * zy) >> 24;
if (xx + yy > 0x4000000) break;
zy = (zx * zy) >> 24;
zx = xx - yy + cx;
zy = zy * 2 - cy;
}
sn += n;
}
}
// n = sn / (DN * DN);
n = sn >> 4;
h += n; // 表示の代わりに集計
}
}
printf("%d\n", h);
printf("(%.3f[sec])\n", clock() / (double) CLOCKS_PER_SEC);
return 0;
}import time
start = time.time()
h = 0
CX0 = 0x4750 / 0x10000
CY0 = 0x1e8 / 0x10000
STP = 14.0 / 0x100000 / 4
for y in range(384):
for x in range(512):
sn = 0
for sx in range(4):
cx = CX0 + (x * 4 + sx) * STP
for sy in range(4):
cy = CY0 + (y * 4 + sy) * STP
zx = zy = 0
n = 0
while n < 447:
xx = zx * zx
yy = zy * zy
if xx + yy > 4: break
tx = xx - yy
ty = zx * zy * 2
zx = tx + cx
zy = ty - cy
n = n + 1
sn += n
n = sn >> 4
h += n
print(h)
print(time.time() - start)start_time = Time.now
h = 0
CX0 = 0x4750 / 65536.0
CY0 = 0x1e8 / 65536.0
STP = 14.0 / 0x100000 / 4
y = 0
while y < 384 do
x = 0
while x < 512 do
sn = 0
sx = 0
while sx < 4 do
cx = CX0 + (x * 4 + sx) * STP
sy = 0
while sy < 4 do
cy = CY0 + (y * 4 + sy) * STP
zx = zy = 0
n = 0
while n < 447 do
xx = zx * zx
yy = zy * zy
if xx + yy > 4 then
break
end
tx = xx - yy
ty = zx * zy * 2
zx = tx + cx
zy = ty - cy
n = n + 1
end
sn += n
sy = sy + 1
end
sx = sx + 1
end
n = sn >> 4
h += n
x = x + 1
end
y = y + 1
end
p h
p Time.now - start_time1 H=0; ASKA [$EDI] = EDI; // EDIレジスタを自由に使いたいときの前処理 2 FOR Y=0,383 3 FOR X=0,511 4 SN=0 5 FOR SX=0,3 6 CX=(X*4+SX)*56+4673536 7 FOR SY=0,3 8 CY=(Y*4+SY)*56+124928 9 ALIAS ZX:ECX, ZY:EBX, XX:ESI, YY:EDI 10 ASKA ZX = 0; ASKA ZY = 0 11 ASKA EAX = 0 12 ASKA [N] = EAX 13 LABEL FORLOOP 14 ASKA EAX = ZX 15 ASKA IMUL ZX 16 ASKA SHRD EAX,EDX,24; // EAX = EDX:EAX >> 24 17 ASKA XX = EAX 18 ASKA EAX = ZY 19 ASKA IMUL ZY 20 ASKA SHRD EAX,EDX,24 21 ASKA YY = EAX 22 ASKA EAX += XX 23 ASKA IF SIGNED EAX > 0X4000000 GOTO SKIP 24 ASKA EAX = ZX 25 ASKA IMUL ZY 26 ASKA SHRD EAX,EDX,24 27 ASKA EAX += EAX 28 ASKA EAX -= [CY] 29 ASKA ZY = EAX 30 ASKA ZX = XX; ASKA EAX = [N] 31 ASKA ZX -= YY; ASKA EAX++ 32 ASKA ZX += [CX]; ASKA [N] = EAX 33 ASKA IF SIGNED EAX <= 446 GOTO FORLOOP 34 LABEL SKIP 35 SN=SN+N 36 NEXT 37 NEXT 38 N=SN>>4; // N=SN/16 (N=0...447) 39 H=H+N 40 NEXT 41 NEXT 42 PRINT H
| コメント | お名前 | NameLink | |