Быстродействие: пустой цикл

Товарищ AtH предложил нам тест быстродействия, основанный на измерении времени выполнения пустых циклов. Однако, интерес представляют собой не только абсолютные величины, но и соотношение с тактовой частотой процессора, говорящее об эффективности программы (в случае ассемблера) или прошивки, на которой она выполняется.

Сводная таблица

Модель Тактовая частота
процессора, МГц
(1)
Пустых циклов в сек
(2)
Коэффицент использования
(2)/(1)
Электроника МК 56 0,1 2,8 28,0
Электроника МК-161 22,0 2313,0 105,1
Форт-161, v1.0 22,0 52,0 2,4
CASIO ClassPad II (*) ? 1000,0 ?
DM42(*) питание от батареи 24 1035,0 43,1
DM42(*) питание USB 80 3000,0 37,5
HP 33E ? 3,6 ?
HP 35s 4 25,4 6,35
HP 41CX (*) 0,360 9,9 27,5
HP 50g (User RPL) 75,0 757,0 10,0
HP 50g (System RPL) 75,0 34482,8 459,8
HP 97 (*) ? 5,5
Sharp EL 9900G ? 2542
Sharp PC g850 (Basic) 8 1049 131,1
Sharp PC g850 (C) 8 2460 307,5
TI-59 (*) 0,225 3,6 16
TI-89 HW2 (*) 12 142,9 11,9
TI-89 HW2 (Assembler) 12 699051,0 58254,3
WANG 452 (*) ? 240,0

(*) - замер сделан для 3000 циклов

Относительно низкий результат HP 50g вызван дополнительным уровнем абстракции: программа исполняется на интерпретаторе UserRPL, тот, в свою очередь, на эмуляторе процессора Saturn, который, наконец, работает на реальном процессоре. Аналогичная проблема у Форта для МК-161.

Программы

МК56

Программа для настольной «Электроники МК 56» (предложена AtH, время измерялось по встроенным часам «Электроники МК-161»):

00.FL0 01.00 02.С/П

Результаты:

  • 362,72 секунд для 1000 циклов = 2,8 циклов/сек
  • 10907,81 секунд (3:01:47,81) для 30000 циклов = 2,75 циклов/сек

Частоту процессора в 100 КГц принимаем таковой для Б3-34 согласно вики.

МК-161

Программа, измеряющая пустые циклы на входном языке «Электроники МК-161» (предложена AtH):

00. Сх
01. 3 ВП 4
04. П0
05. 65535
10. П9
11. РРП 9050
14. FL0 14
16. РРИП 9050
19. ИП9
20. ↔︎
21. -
22. ВП 2 /-/
25. С/П
26. БП 00

Результат: 12,97 секунд для 30000 циклов = 2313 циклов/сек.

Обновление от 28/11/2015

00. Сх
01. 3 ВП 4
04. П0
05. 65535
10. РРП 9050
13. FL0 13
15. РРИП 9050
18. -
19. ВП 2 /-/
22. С/П
23. БП 00

Результат: 12,98 секунд для 30000 циклов = 2311 циклов/сек.

DM42

Программа предложена Виталием Самуровым.

00 { 24-Byte Prgm }
01▸LBL "BB"
02 3000.00001
03 STO 00
04▸LBL 00
05 DSE 00
06 GTO 00
07 RTN
08 END

Результат (3000 циклов):

  • питание от батареи: 2.9 секунды = 1035 циклов/сек.
  • питание от USB: 1 секунда = 3000 циклов/сек.

HP 50g

Тест пустого цикла для HP 50g на основном входном языке User RPL (предложена С.Тарасовым)

« 
TICKS
1 30000 START NEXT
TICKS 
SWAP - B->R 8192 /
»

Результат: 39,64 секунд для 30000 циклов = 757 циклов/сек.

Тест пустого цикла для HP 50g на System RPL (предложена С.Тарасовым)

::
 CLKTICKS
 30000 BINT1
 DO
 LOOP
 CLKTICKS
 SWAP bit- HXS>% % 8192 %/
;

Результат: 0,87 секунд для 30000 циклов = 34482,8 циклов/сек.

HP 35s

Программа теста для HP 35s использует встроенный цикл с декрементом (предложена С.Тарасовым)

A001 LBL A
A002 RPN
A003 30000.00001
A004 STO Z
A005 DSE Z
A006 GTO A005
A007 RTN

Результат: 1182 секунд (19:41.790) для 30000 циклов (замер по секундомеру stopwatch из linux) = 25,4 цикла/сек.

Более полные испытания HP 35s также совпадают с полученной цифрой: Timing for HP 35s Calculator Instructions (PDF, англ.яз). См. также:

TI-59 (1977)

Программу и результаты измерений Guillaume Tello (личный сайт на англ. и франц. языках).

000 LBL A
002 3 0 0 0 STO 00
008 DSZ 0 008
012 R/S 

Результат: 551 секунда (9:11) для 3000 циклов = 5,5 циклов/сек.

WANG 452 (1973)

Программу и результаты измерений Guillaume Tello. Калькулятор оснащен кварцем на 4 МГц, но реальная тактовая частота ниже, её величину требуется уточнить.

0000 3 0 0 0 STORE
0005 1 -
0007 SKIP IF X=0
0008 GOTO -3
0010 STOP END 

Результат: 12,5 секунд для 3000 циклов = 240 циклов/сек.

HP 97

Программу и результаты измерений предоставил Guillaume Tello.

LBL B
DSZ I
GOTO B
RTN
LBL A
3000 STO I
GOTO B

Результат: 844 секунды (14:48) для 3000 циклов = 3,6 циклов/сек.

HP 33E

Программу и результаты измерений предоставил Serguei_Tarassov.

ENTER
1
-
g x>0
GTO 01
R/S

Запуск: GTO 00 1000 R/S
Результат: 276 секунд (4:36) для 1000 циклов = 3,6 циклов/сек.

HP 41CX

Программу и результаты измерений предоставил Guillaume Tello.

LBL BB
3000.00001 STO 00
LBL 00
DSE 00
GTO 00
RTN 

Результат: 303 секунды (5:03) для 3000 циклов = 9,9 циклов/сек.

TI-89 (HW2)

Программы и результаты измерений предоставил Guillaume Tello.

test()
Prgm
For i,1,3000
EndFor
EndPrgm 

Результат: 21 секунда для 3000 циклов = 142,9 циклов/сек.

На ассемблере ($02000000 = 33 554 432)

   move.l #$02000000,d0
.loop:
   subq.l #1,d0
   bne.s .loop
   rts

Транслируется в

Exec "203c02000000538066fc4e750000"

Результат: 48 секунд для 33 554 432 циклов = 699 051 циклов/сек.

CASIO ClassPad II

Программу и результаты измерений предоставил Guillaume Tello.

For 1=>i to 3000
Next
Stop

Результат: 3 секунды для 3000 циклов = 1000 циклов/сек.

Sharp PC g850

Программы и результаты измерений предоставил Ardo_79.

BASIC (встроенный входной язык)

10 FOR X=1 TO 30000
20 NEXT

Результат: 28,6 секунд для 30000 циклов = 1049 циклов/сек.

С (встроенный входной язык)

10 main() {
20 int x;
30 for(x=1;x<=30000;x++) {}
40 }

Результат: 12,2 секунд для 30000 циклов = 2460 циклов/сек.

Sharp EL 9900G

Программы и результаты измерений предоставил Ardo_79.

BASIC (встроенный входной язык)

FOR X,1,30000
NEXT

Результат: 11,8 секунд для 30000 циклов = 2542 циклов/сек.

Русский

Комментарии

Обновлённые данные по языку Каллисто для «Электроники МК-161» здесь.

Измерил вчерашний альфа-релиз 0.3.5a. В нём константа 256 занесена в RE, что немного увеличило быстродействие адресного интерпретатора по сравнению с предыдущим замером версии 0.3.2a. Также включил туда ваши замеры по HP 35s и HP 50g, спасибо!

Приятное открытие, что Каллисто смогла обогнать вдвое HP 35s — даже при том, что Форт был реализован поверх ЯМК, а не закрытого для нас машинного языка (низкий коэффициент использования, по вашей терминологии).

Замер по предложенной программе на моём HP 50g дал 37,73 секунды.
795 холостых циклов в секунду.

VER
4.20060919

Исходный тест требует проведения 30000 циклов и предложен Джоном Джеймсом (John S James) из Беркли, Калифорния в журнале «Байт» за август 1980 г. (том 5 номер 8) на стр.114 в Листинге 5 под названием TIME-TEST. Сегодня я обновил данные по «Электронике МК-56», честно выполнив все 30000 циклов. По внешнему таймеру получилось 3:01:47,81 — удивительно точно 2,75 циклов в секунду. Извиняюсь, что подал дурной пример.

Можете провести полный тест HP 35s — выполнив все требующиеся 30000 циклов? К сожалению, у меня нет этой «железки» и самостоятельно её измерить не могу.

Сейчас HP 35s это единственный калькулятор, который из-за недостаточного количества проведённых циклов несколько выбивается из таблицы.

Добавил для 30000 и HP 35s. Если я не ошибся в предоставленных данные по частоте процессора 33 КГц, то по эффективности микрокода (прошивки) это чудо американской инженерной мысли 40-летней давности перекрывает всех с большим запасом.

Комментарий был перемещен и теперь находится здесь.

Результат: 8 МГц 28,6 секунд для 30000 циклов = 1049 циклов/сек.
Коэффициент использования - 131.125 ( BASIC )

8 МГц 12,2 секунд для 30000 циклов = 2460 циклов/сек.
Коэффициент использования - 307.5 ( Cи )

Ardo_79 wrote: Результат: 8 МГц 28,6 секунд для 30000 циклов = 1049 циклов/сек.
Коэффициент использования - 131.125 ( BASIC )
8 МГц 12,2 секунд для 30000 циклов = 2460 циклов/сек.
Коэффициент использования - 307.5 ( Cи )

Спасибо! Не могли бы вы привести текст программ?

BASIC
10 FOR X=1 TO 30000
20 NEXT

Си
10 main() {
20 int x;
30 for(x=1;x<=30000;x++) {}
40 }
Причем Си встроенный в Sharp PC g850

Сергей, я улучшил программу для оценки быстродействия МК-161 «на холстом ходу», можно обновить её код?
00. Сх
01. 3 ВП 4
04. П0
05. 65535
10. РРП 9050
13. FL0 13
15. РРИП 9050
18. -
19. ВП 2 /-/
22. С/П
23. БП 00

Вот сегодняшнее измерение для МК-161, версия 1.20 от 08.07.14:
1 запуск 12,98 (подсветка вкл)
2 запуск 12,98 (подсветка вкл)
3 запуск 12,98 (подсветка вкл)
4 запуск 12,98 (без подсветки)
5 запуск 12,98 (без подсветки)

Итого 30000 циклов требует 12,98 секунд, то есть 2311 циклов/с

Обновил, только новый результат чуть хуже предыдущего.

Спасибо. В прошлой версии инициализация занимала чуть больше времени. Возможно, таймер успевал «тикнуть» до первого замера — а сейчас первый «тик» происходит уже во время основного цикла. Это всё в пределах погрешности.

P.S. Сейчас измерил 300 тыс. циклов. Результат 129,45 c. 2317,5 циклов в секунду.

Результат: ? МГц 11,8 секунд для 30000 циклов = 2542 циклов/сек.

FOR X,1,30000
NEXT

30000 циклов за 9 минут 37,23 с
Итого 577,23 с или 51,97 пустых циклов в секунду