Calculator Benchmark: Loops of addition
Calculator Benchmark: Loops of addition original entry on MoHPc
Presently in order from fastest to slowest.
This benchmark goes after ONLY goes after one thing: loops of addition.
LBL 01 + GTO 01
where the stack contains 0 1 1 1 on 4 level machines. In other words, start with 0 and do repeated additions of 1 for 60 seconds. What is the result? Alternative methods that count 1 at a time are allowed and included, such as going through an ISG / DSE loop. Long repeated programs of + + + + are not.
Physical calculators
Notation
HP 50g 2.15, ARM ASM, 75MHz
-
Count: 593'615'984
Note: After toying around with the addloop benchmark, I found out that my optimization does really help a lot. After throwing it out (delete the lines that say
TST R2,$F
and
BNE loop
) I just got 158998232. And when I increased the number of additions between the ON key checks from 16 to 256 (by replacing
$F
with
$FF
), I even got
728'608'512. The keyboard was still responsive enough, it “only” checked the ON key about 47000 times per second.
3298
Note: I made a small optimisation: the ON key is only checked when the lowest 4 bits of the counter are 0. This avoids some memory accesses (ARM I/O is always memory-mapped) without losing too much precision - after all, I stopped it while looking at a normal clock. Also, I used two registers for the counter because I feared a single register would overflow. This was not the case, but as the result showed, 8 minutes would have made it overflow.
-
HP 50g 2.15, HPGCC, 75MHz
Count: 161,722,281
#include <hpgcc49.h>
int main(void)
{
unsigned int c=0;
unsigned int volatile * GPFDAT = (int*) 0x7A00054;
sys_slowOff(); //press ON to stop
while(!(*GPFDAT&1))
c++;
sat_push_zint_llong(c);
return 0;
}
Ti-89 Titanium, GCC4TI, HW4 running AMS 3.10 patched with my tiosmod+amspatch
-
Count:
Notes:
building them requires GCC4TI, they won't compile with the older, unmaintained and much harder to install TIGCC.
the main loop is a tiny code snippet buried into the rest of accuracy-increasing measures and dealing with the consequences of pressing the ON key;
the main loop in addloop1 is a 1:1 copy of that of the HP-50g benchmark;
the main loop in addloop2 is closer to interpreted languages, since at least, the variable is read from + written to memory, and it shows ~2.5x slowdown.
-
HP-12C+, Scott’s custom firmware
Count: 10,794,647
Do { ++x; } while ((((*(unsigned long int*)PIOC_PDSR) & c_mask)==c_mask));
Casio fx-CG 10 PRIZM,
OS version 01.04.3200, C PrizmSDK
3)
HP48G/GX/G+ version R ROM models Saturn ASM – 8x loop unrolling
-
C=0 W
P= 5
l1 C=C+1 A
GOC l2
C=C+1 A
GOC l2
C=C+1 A
GOC l2
C=C+1 A
GOC l2
C=C+1 A
GOC l2
C=C+1 A
GOC l2
C=C+1 A
GOC l2
C=C+1 A
GOC l2
C=C+1 A
GONC l1
l2 C=C+1 P
GONC l1
-
Hp50g Saturn ASM
Count: 6,469,858
OS version 2.15 with HPGCC3 patch 75MHz.
7)
CODE
GOSBVL SAVPTR
D0=80EAB ;ATTNFLG
A=0.W
*loop
A+1.W
C=DAT0.A
?C=0.A
GOYES *loop
GOSBVL GETPTR
P=15
GOVLNG PUSHhxsLoop
ENDCODE
Prime: v2013.8.13
Count: 6,646,300
export LOOP()
begin
A:=0;
for A from 1 to 1E9 do
end;
end;
Recall A after ON to stop running on 1 min. Average of several runs.
HP48G/GX/G+ version R ROM models Saturn ASM
-
P= 5
C=0 W
l1 C=C+1 A
GONC l1
C=C+1 P
GONC l1
HP-71B USA:2504A00223 HP71:1BBBB FTH:1A, year of production 1984?
Hp39gII
-
EXPORT LOOP()
BEGIN
A:=0;
FOR A FROM 1 TO 1E9 DO END;
END;
-
EXPORT ADDLOOP()
BEGIN
A:=0;
REPEAT
A:=A+1;
UNTIL 0;
END;
Casio fx-CG 10 PRIZM,
OS version 01.04.3200, LuaZM
12)
Count: 893207 sec overclocked to 94.3MHz (max overclocking without freezing
Count: 547223 sec default 58Mhz
Note: When running this code, note that it breaks when AC/on is pressed. I used the fastest Getkey routine for PRIZM, I may try a test directly polling the RTC in the future.
zmg.keyDirectPoll()
for i=1,100000000000 do
zmg.keyDirectPoll()
if zmg.keyDirect(10)>0 then print(i) break end
end
HP 30b with TSTSYS ON
Count: 531,131
LBL 00 ISG 0 Stop GOTO 00, with 0 pre-stored in 0. Result indicates count of loops in one minute. Each loop adds 1 to value in memory 0.
(as first program in memory)
-
DM42 -USB connected screen turned off. RPN
-
01 LBL "xxx"
02 "RefLCD"
03 ASTO ST L
04 RCL IND ST L
05 STO 00
06 0 STO IND ST L
07 1E7
08 ENTER
09 LBL 00
10 DSE ST X
11 GTO 00
12 ASTO ST L
13 RCL 00
14 STO IND ST L
15 END
FX-9860G SD Fast Mode
HP 34s Build 1099
Count: 272,538
Code: LBL A, +, BACK 01
FX-9860G SD Fast Mode
HP 30b with TSTSYS ON
HP 30b with TSTSYS ON
FX-9860G SD Fast Mode
FX-9860G SD
HP 50g (SysRPL bint)
FX-9860G SD
FX-9860G SD
WP 34s Stack depth 4
LBL'XYZ' + GTO'XYZ' 90891
LBL A + GTO A 90675
LBL 00 + GTO 00 90369
Casio fx-CG 10 PRIZM with CASIO-BASIC
16)
HP 12c+
Count: 78,640
Code: + GTO 01
WP 34s Stack depth 8
HP 30b
HP 9825 B
HP 15c le
+ x=0? 59006 or 59182
ISG 00 41062 or 41048
ISG I 40746
ISG .9 40922
HP 50g (SysRPL floating point)
Casio fx-9860G Slim
HP-9100A SERIAL NUMBER 816-01071 (1971?)
Count: 49,391
Code: +, GO TO 00
hp 15c le stopped by hand, maybe 2 s +/-
Count: ~ 48,000
LBL E + GTO E 48823
LBL 09 + GTO 09 48763
LBL A + GTO A 48721
LBL 01 + GTO 01 48509
LBL .9 + GTO .9 44448
LBL .1 + GTO .1 44083
HP 9815S
Count: 47,592
Code: 000 + 001 GOTO 000
HP-9100B
Count: 47,394
Code: +, GO TO, 0, 0
HP-71B Forth Xerxes:
COUNT: 46,575
Forth
: XERXES 1 SWAP 0 DO 1+ LOOP ;
46575 XERXES DROP
BYE
HP 50g
HP 9815A/S
Count: 31,156
Code; LBL, A, 1, +, GTO A
HP 48gII Exact mode (old version)
HP 48gII
TI-83+ SE
HP 85
Sharp EL-9900
HP-75C (1982)
TI-81
TI-83
-
Code: :For(I,1,99999) :End
Count: 12,986
Code: Lbl B: ans +1: goto B
Casio fx-9750G Plus rom 1.00 @ 4mhz with CASIO-BASIC
18)
TI-85
-
Code: :For(I,1,99999) :End
Count 11,100
Code: Lbl A : Ans + 1 : Goto A : End
Casio FX-7500G
Count: 15,364
Code: Lbl 1 Isz A Goto 1
HP 9810A
Count: 15,355
Code LBL, 1, +, GTO, 1
TI-81
TI-84 Silver Edition
Casio Algebra FX 2.0 rom 1.05 clock around 24 mhz
20)
TI-86
-
Code: :For(I,1,99999) :End
Count 5,347
Code: Lbl A : Ans + 1 : Goto A : End
TI-89 Titanium (HW 4, AMS 3.10) patched with tiosmod/amspatch
note: I reran the TI-89t tests because there are evidently more variables influencing the benchmark results than I realized. The last test was in a folder with various variables in it and other stuff on the home screen. I did the test again from an empty folder and a completely cleared home screen and got these results.
22)
Count:
In AUTO mode: 12655.33 avg.
In EXACT mode: 12649.67 avg.
In APPROX mode: 4958.33 avg.
Code: For x,1,9999999999:EndFor
Count:
In AUTO mode: 12372.33 avg.
In EXACT mode: 12335.33 avg.
In APPROX mode: 8591.33 avg.
Code: 0→x:Loop:x+1→x:EndLoop
Count:
Code: 0→x:While true:x+1→x:EndWhile
Count:
Code: 0→x:Lbl a:x+1→x:Goto a
HP 49G
-
The NEWT 41CL logic board upgrade for the HP 41.
Code: LBL 00 + GTO 00
1X mode: 1,055
2X Turbo mode: 1,913
5X Turbo mode: 4,153
10X Turbo mode: 6,538
20X Turbo mode: 9,179
50X Turbo mode: 12,022
HP 48GX
TI-89 Titanium (HW 2, AMS 2.08) patched with tiosmod/amspatch
note: I reran the TI-89t tests because there are evidently more variables influencing the benchmark results than I realized. The last test was in a folder with various variables in it and other stuff on the home screen. I did the test again from an empty folder and a completely cleared home screen and got these results.
24)
Count:
Code: 0→x:Loop:x+1→x:EndLoop
Count:
Code: 0→x:While true:x+1→x:EndWhile
Count:
Code: For x,1,9999999999:EndFor
Count:
Code: 0→x:Lbl a:x+1→x:Goto a
Casio Fx 5800
HP 49G
Psion Organiser II CM (1997)
HP-48G
Casio FX-7500G
Count: 10,692
Code: Lbl 1 Ans+1 Goto 1
TI-83+
HP 33s
Count: 10,097
Code: LBL A + GTO A
TI CC-40
TI-89 Titanium
-
Casio FX-7500G
Count: 8,878
Code: Lbl 1 A+1→A Goto 1
TI-83
Casio FX-7500G
Casio fx-7000GB
HP-48SX
Count: 7,352
Code: Unknown
FX-603P
HP-42s FAST MODE S/N 2849A with goose disabled
HP-32s
Count: 5,973
Code: LBL A + GTO A
TI-92
HP-28S
HP 50G (normal speed)
HP 35s
FX-5800P
PC-1247
Count: 5,180
Code: 1:A=A+1:GOTO1
HP 20S
Count: 4,837
Code: LBL A, +, GTO A
HP-32sii
Count: 4,715
Code: LBL A, +, GTO A
HP-42s FAST MODE S/N 2849A
Count: 4,419
Code: LBL 01 + GTO 01
HP-71B
Count: 4,320
10 DESTROY A @ A=0
20 ON TIMER #1,60 GOTO 40
30 A=A+1 @ GOTO 30
40 DISP A
HP 48gII (Original 3 batteries, NO USB)
HP-20S
Count: 4,170
Code: Unknown
HP 35s
Count: 3,652
Code: LBL B, +, GTO B001
TI-86
Count: 3,612
Code: Lbl B:1+A→A:Goto B
HP 39gs
Aurora HP 12c clone
Count: 3,554
Code: +, GTO 01
TI-95
Count: 3,350 counts
Code: 1 + GTO 0000
Radio Shack PC-2
Casio fx602p
Sharp EL-9650
HP 48gII (Original 3 batteries, NO USB)
TI-80
-
Code: :For(I,1,99999) :End
Count 2,279
Code: Lbl A : Ans + 1 : Goto A : End
HP-42S with “goose” disabled. Non-fast mode.
HP 48gii Exact mode (Original 3 batteries, NO USB)
HP-42S
Count: 2,115
Code: LBL 00 + GTO 00
Sharp EL-5500III
Count: 2,056
Code: 1 A=A+1: GOTO 1
DM-15cc
Count max: 2038
000 +
001 x=0
Just fill the stack with 1s and hit the R/S key.
For this to work all the programs have to be cleared beforehand.
Another variant is to start with 0 in register I and use this program:
000 ISG I
The results are 2038 and 1669 using a DM-15CC.
HP-41CY Turbo
Count: 1,982
Code: LBL 00, +, GTO 00
Sharp EL-5500II
Count: 1,510
Code: 1 A=A+1: GOTO 1
HP 9G
HP 12c plat 25th anniv.
Count: 1,435
Code: +, Goto 001
HP 12c platinum
Count: 1,386
Code: + GTO 001
HP41CX Synthetic:
Count: 1,298
01 LBL "X”
02 1
03 "SeeRemark"
!!! Synthetic string 9 long Decimal 249 96 7 117 131 131 131 64 178 176
this places 96 7 in N to be transferred in reg b, resulting in
program counter in reg M, byte 6. In reg M synthetic code results
in: RDN ENTER ENTER ENTER + GTO 01. The GTO 01 is a COMPILED GTO
jumping to the + before it! You can SST this code but the GTO 01
takes a long time to reposition! Yes, this can be optimized still a
bit, but the loop is using 3 bytes!
04 0
05 X<> N
06 BEEP
07 STOP
08 STO b
09 END
INSTRUCTION: READ THIS
XEQ "X"
wait until beep, 000000,06 is displayed
press [R/S] to start counting
press [R/S] after 60 seconds, write down the count
perform a GTO .. !!! because the program pointer is in reg M, switching to program mode and TOUCHING A KEY results in MEMORY LOST!
CASIO PB-700
Sharp PC-1251
HP41CX:
Count 1,075
Code: LBL 01 + GTO 01
HP 41c
Count: 1,063
Code: LBL 01 + GTO 01
TI-59
HP-65
Count: 578
Code: Lbl 1, +, Goto 1
HP-10C
Count: 514
Code: LBL 0 + GTO 0
HP-25
Count: 512
Code: 01 + 02 GTO 01
TI-59 starting with 1 in the display
Count: 501
Code: SUM 00 RST
HP 12c original (mfg. 1985)
Count: 500
Code: +; GTO 01
TI-57
TI-59
Count: 492
Code: OP20 RST
HP 25
Count: 483
Code: + GTO 01
TI SR-56
Count: 461
Code: + 1 = RST
TI SR-52
Count: 425
Code: + 1 = RST
HP-38C
Count: 387
Code: + GTO 01
TI 58C
Count: 387
Code: + 1 = RST
Human hand Tapping + key
HP-29C
Count: 361
Code: LBL 0; +; GOTO 0
SHARP PC-1211
HP 11c
Count: 353
Code: Lbl 1, +, Goto 1
TI-59
Count: 336
Code: 1 + GTO 000
HP-33c (mfg. 1982)
Count: 319
Code: 01 + 02 GTO 01
HP 67
HP 55
Count: 312
Code: + GTO 01
HP-19c
Count: 301
Code: LBL 1 + GTO 1
HP 15c (mfg. 1983)
Count: 297
Code: LBL A; +; GTO A
HP 16c: 293 (float 4)
Count: 293
Code: LBL A + GTO A
HP 34c: (I program) with -1 stored in I
Count: 277
Code: LBL A + GTO f I
HP 34c (mfg. 1981)
Count: 269
Code: LBL A; +; GTO A
TI-55
HP 34c:
Count: 259
Code: LBL A + GTO A
Odhner in hands of T. Klemm on 10 Sept 2013, 5:46 p.m.
HP 16c
Count: 245
Code: Lbl 1, +, Goto 1
HP 16c: 230 (decimal, wsize 16, 2-complement)
Count: 230
Code: LBL A + GTO A
HP 67
Count: 226
Code: LBL 1 + GTO 1
HP-97
Count: 223
Code: LBL1; +; GOTO 1
Texas Instrument TI-57LCD
Count: 216
Code: LBL_01 1 + GTO_01
TI-66
Count: 210
Code: + 1 = RST
TI-65
Texas Instrument TI-57LCD
TI-55
Count: 189
Code: + 1 = RST
TI BA 55
Count: 139
Code: + 1 = RST
Elektronika MK-61
Count: 106
Code: + GSB 00
TI-62
Commodore P50
TI-59 with RPN Module:
Count: 74
HP-67 code: LBL 1 + 1 GOTO 1
The RPN Module translated that to:
LBL LNX PGM 51 A 1 PGM 12 A GTO LNX
Needs confirmation
Casio fx-9860g Slim Compiled C program SDK V 1.0
HP-12C+, Scott’s custom integer firmware, overclocked to 48.75
MHz
Emulators on handheld/mobile devices