Тест "Счастливые билеты"

В книге "Систематический подход к программированию"[1, стр. 100] из популярной серии приводились примеры реализации алгоритма поиска "счастливых" билетов. Книгу я использовал в процессе учёбы, поэтому некоторые моменты осели на чердаке памяти. Спустя почти 30 лет появилась идея использовать алгоритм перебора для оценки качества генерируемого компиляторами кода. Заметно выросшие вычислительные мощности ЭВМ вынуждают увеличивать сложность перебора на два порядка (до 8 цифр) для замера времени, которое в варианте для 6 цифр находится в пределах миллисекунды.

Теперь тот же тест в оригинальном виде может быть использован и для оценки быстродействия современных калькуляторов.

Задача

Билеты для проезда на транспорте нумеруются шестизначными цифрами. "Счастливым" считается билет, сумма первых трех цифр которого совпадает с суммой трех оставшихся цифр. Требуется найти общее количество "счастливых" билетов в серии 000000..999999.

Для проверки корректности тестовой программы, полученный результат должен быть равен 55252 с учетом номера 000000 или на единицу меньше без учета.

Перебор без оптимизации

Наиболее простым вариантом является перебор всех 106 вариантов с вычислением и сравнением соответствующих сумм разрядов на каждом шаге. Полный перебор всех вариантов является обязательным условием теста без алгоритмической оптимизации.

Программы для МК61/52/161

К сожалению, ПМК обладает всего 4 регистрами циклов, поэтому два оставшихся приходится реализовывать условными переходами. Для сокращения времени счета, условные переходы используются для внешнего и первого циклов из шести. Также мы используем не меняющий результат интервал 1..10 вместо 0..9 для каждого разряда. Программа выглядит так:

   00    01    02    03    04    05    06    07    08    09 
00 0     П7    1     0     П8    П5    ИП8   П4    ИП8   П3    
10 ИП8   П2    ИП8   П1    ИП8   П0    ИП0   ИП1   +     ИП2   
20 +     ИП3   -     ИП4   -     ИП5   -     Fx=0  33    ИП7   
30 1     +     П7    FL0   16    FL1   14    FL2   12    FL3
40 10    ИП4   1     -     П4    Fx=0  08    ИП5   1     -     
50 П5    Fx=0  06    ИП7   С/П

Запуск: В/0, С/П

Для старых моделей МК61/52 время счет должно составлять долгие часы, поэтому просто оценим его, взяв время выполнения самого нижнего цикла и умножив его на 105. Вводим следующую программу:

   00    01    02    03    04    05    06    07    08    09 
00 ИП8   П0    ИП0   ИП1   +     ИП2   +     ИП3   -     ИП4   
10 -     ИП5   -     Fx=0  19    ИП7   1     +     П7    FL0   
20 03    С/П

В регистры заносим: 1 П1 П2 П3 П4 П5, 0 П7, 10 П8.
Запуск: В/0, С/П

На моём МК52 время счета нижнего цикла составило 40 секунд (результат: 1 билет). Соответственно, общее потребное время можно оценить как 40*105 секунд, что составит порядка 1111 часов или 46 дней! Не думаю, что имеет смысл делать реальный тест на таком вычислительном оборудовании.

Другие модели

Для других моделей предлагаю вначале оценить время счета нижнего цикла, после чего принимать решение о реальном тесте. Просьба приводить программы и хронометраж с точностью до минут или минут и секунд, если время окажется в пределах нескольких минут, итоговые результаты будут сведены в таблицу.

Оптимизация

Кроме теста на производительность, задача является полем для аналитической оптимизации. Например, в нижний цикл имеет смысл входить только если сумма-разность предыдущих пяти разрядов больше нуля.

Результаты

Без алгоритмической оптимизации

Программа без алгоритмической оптимизации должна производить полный перебор всех вариантов номеров от 0 до 999999.

Модель ПМК Время счёта (без оптимизации), минуты
МК52 66667 (оценка)
МК161 92
Casio 9750 GII 96
DM42 12'35"
SHARP PC-G850S 23
HP35s 2010 (оценка)
HP50g UserRPL 282
HP50g SysRPL 5

С оптимизацией

Модель ПМК Время счёта (без оптимизации), мин:сек
Casio 9750 GII 56:05
Casio fx-9860G Slim 46:48
Casio fx-9860G SD 49:07
SHARP PC-G850S 13:22

Литература

  1. Вьюкова Н.И., Галатенко В.А., Ходулев А.Б. Систематический подход к программированию. Под ред. Ю.М. Банковского. - М.: Наука, 1988. - 208 с. Серия: Библиотечка программиста.

Комментарии

МК-161 (версия прошивки 1.20), полный тест: 1 час 32 мин

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Время, в целом, соответствует. Еще на тесте "8 ферзей" разница по скорости с МК61/52 была примерно в 1300 раз. Т.е. ожидалось около 1 часа.

P.S. Как же я чертыхался, переписывая эту программу без меток в абсолютных адресах... В "МК61 Gold" надо ввести режим вставки.

Да, примерно та же пропорция скорости.
Надо бы hp35s проверить на полном тесте

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Навскидку набросал свой вариант "билетов", перебор всех 1000000 вариантов, из номера выделяется по одной цифре, начиная с младшей, и сравниваются суммы цифр младшей и старшей половин номера. Используются всего два цикла, первый - миллион билетов, второй выделение трёх цифр каждой половины номера, после испытания программу оптимизировал чтобы сумма цифр старшей половины рассчитывалась только после перебора младших половин.

Собственно программа:

Сх П7 П8 1 ВП 6 П0 1 0 F1/x
П9 ИП7 ПА ПП 40 ПВ Fx=o 21 ПП 40
ПС ИПС ИПВ - Fx=o 30 ИП8 1 + П8
ИП7 1 + П7 FL0 11 ИП8 С/П БП 00
3 П1 ИПА К[х] ИП9 × ПА К{х} FL1 42
+ + В/О

Программа занимает 53 байта. Запуск В/О, С/П, после останова в регистре РХ выводится число "счастливых билетов", равное 55252.

Назначение регистров Р0 - счётчик билетов, Р1 - счётчик цифр половин номера, Р7 - номер билета, Р8 - номер "счастливого" билета, Р9=10, РА - регистр для выделения цифр, РВ - сумма цифр младшей половины, РС - сумма цифр младшей половины.

Время выполнения теста на эмуляторе 2:30 на процессоре Athlon 2500+ 1,8 ГГц, программа Сергея Тарасова на том же эмуляторе работает всего минуту) Написано в 19:33.

Добавлено в 23:53: На "железном" МК-161 с прошивкой 1.20 мой тест выполнился за 3:29:28)

подборка статей из Кванта и других популярных изданий про "Счастливые билеты":
http://www.ega-math.narod.ru/Quant/Tickets.htm

Допилил "Счастливые билеты" под Форт на msp430g2553. Результат: 40 секунд.

4E4th R0.34 Apr 28 2012|110001110 Cold
VARIABLE t ok
VARIABLE n1 ok
VARIABLE n2  ok
VARIABLE n3 ok
VARIABLE n4 ok
VARIABLE n5 ok
VARIABLE n6 ok
VARIABLE ls ok
VARIABLE rs ok
0 t ! ok
: howmuch
red cclr
green cclr
10 0 DO i n1 !
10 0 DO i n2 !
10 0 DO i n3 !
10 0 DO i n4 !
10 0 DO i n5 !
10 0 DO i n6 !
n1 @ n2 @ + n3 @ + ls !
n4 @ n5 @ + n6 @ + rs !
ls @ rs @ = IF 1 t +! THEN
LOOP
LOOP
LOOP
LOOP
LOOP
LOOP
red cset
t @ u. ; ok
howmuch 55252 ok

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Можно избавиться от переменных ls и rs, результаты суммирования оставлять в стеке.

Да, видимо.
Это мой первый блин в Forth, вообще

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Блин хороший. Я бы использовал i вместо n6 @, j вместо n5 @ (это стандартные слова, которые есть в любом Форте) и определил собственные слова, берущие из стека возвратов значения других переменных цикла:
: k вместо VARIABLE n4
: l вместо VARIABLE n3
: m вместо VARIABLE n2
: n вместо VARIABLE n1

Тогда это будет классическим Фортовским решением, когда пишутся слова, в которых формулируется завершающее слово программы.

Цикл DO хранит значение своей переменной в стеке возвратов. В Форте должно быть слово, дающее адрес вершины стека возвратов. В Каллисто это RP@

По некоторым смещениям относительно этой вершины и находятся i j k l m n, переменные вложенных циклов. Точные значения смещений можно узнать либо из исходного кода Форта, либо экспериментально — просматривая дамп памяти изнутри самого внутреннего цикла.

Обычно стек возвратов растёт вниз (смещения тогда будут положительные), но если внезапно переменные циклов не найдутся, можно проверить и отрицательные смещения.

Это пока высший пилотаж для меня :)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

tca wrote: Можно избавиться от переменных ls и rs, результаты суммирования оставлять в стеке.

Избавление от переменных еще избавило от 11 секунд :) Результат: 29 секунд

4E4th R0.34 Apr 28 2012|110001110 Cold
VARIABLE t ok 
VARIABLE n1 ok 
VARIABLE n2 ok 
VARIABLE n3 ok 
VARIABLE n4 ok 
VARIABLE n5 ok 
VARIABLE n6 ok 
0 t ! ok 
red cclr ok 
green cclr ok 
: howmuch 
10 0 DO i n1 ! 
10 0 DO i n2 ! 
10 0 DO i n3 ! 
10 0 DO i n4 ! 
10 0 DO i n5 ! 
10 0 DO i n6 ! 
n1 @ n2 @ + n3 @ + 
n4 @ n5 @ + n6 @ + 
= IF 1 t +! THEN 
LOOP 
LOOP 
LOOP 
LOOP 
LOOP 
LOOP 
red cset 
t @ u. ; ok 
howmuch 55252 ok

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

\ Опробовал такой код на VFX Forth STM32L (тактовая 32МГц)
\ при компилировании кода вместе с системой
\ 1-й вариант 2,5 сек
variable tmp1
variable cnt1
: howmuch
10 0 DO I
10 0 DO I
10 0 DO I
10 0 DO I
10 0 DO I tmp1 !
10 0 DO
2OVER 2OVER tmp1 @ I
+ + >R
+ + R> = IF 1 cnt1 +! THEN
LOOP
LOOP
DROP LOOP
DROP LOOP
DROP LOOP
DROP LOOP
cnt1 @ .
;
howmuch 55252

\ 2-й немного изменённый вариант и время выполнения 2сек
variable tmp1
variable cnt1
: howmuch
10 0 DO I
10 0 DO I
10 0 DO I
10 0 DO I
10 0 DO I tmp1 !
10 0 DO
2OVER 2OVER tmp1 @ I
+ + 2SWAP + ROT +
= IF 1 cnt1 +! THEN
LOOP
LOOP
DROP LOOP
DROP LOOP
DROP LOOP
DROP LOOP
cnt1 @ .
;
howmuch 55252

P.S. По варианту с использованием переменных замер дал 3.4 сек (18сек если программа введена интерактивно)
и по выше вариантам 11.07 и 11.3 при интерактивном вводе программы по Уарт интерфейсу.
т.е. без оптимизационных возможностей компилятора.
P.S. https://atariwiki.org/wiki/Wiki.jsp?page=Forth%20Benchmarks
Некоторые ещё измеренные Forth Benchmarks разного железа

P.S. По варианту с использованием переменных замер дал 3.4 сек
Это тот вариант, что у меня выше был 29 секунда на msp430 ?

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

18 сек при "трансляции", но как то по разнице в тактовых частотах (если 8 МГц у MSP430 vs 32MГц)
отличия по времени не настолько ощутимы. Вероятнее внутренние затраты на организацию Форт системы
и обслуживание тиков таймера и уарта (навскидку) и сохранение при этом некоторого контекста
у STM32L VFX более трудозатратно архитектурно.

P.S. Можно и код ассемблерный в разных вариантах рассмотреть.
VFX Forth для MSP430 тоже доступен. http://www.mpeforth.com/xc7lite.htm

интересно!

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Проверил и получилось 2 мин 8 сек (~8МГц)

P.S. VFX Forth "ковырял" на предмет его дизасемблирования и тоже с задействованием Форт инструментария.
Есть даже какие то результаты. :)

понятно, что msp430 16-битный и другой архитектуры, но, тем не менее

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Думаю разрядность вносит главные задержки для 16 разрядности (этим конечно можно гибче управлять),
к тому же у MSP430 по общему ощущению более удачная система команд для реализации классики Форт
и вероятнее более эффективнее реализация механизма выполнения FVM кода.
Но при желании, при генерации кода, можно провести некоторые критические оптимизации
и существенно улучшить временные характеристики прохождения теста.
Какие то ключевые слова в AmForth могут быть определены высокоуровневыми.
На fforum.winglion.ru есть ссылки и на другие Форт системы для AVR.

P.S. И ещё. Есть некоторое сомнение что ядро MSP430 запущено на 8МГц, а не на 16МГц.
Без "препарирования" кода выводы будут всегда неоднозначны

Кстати, может таки и на 16 МГц

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Casio 9750 GII
0→s
For 0→x to 9
For 0→y to 9
For 0→z to 9
For 0→a to 9
For 0→b to 9
For 0→c to 9
If (x+y+z)= (a+b+c) :then
s+1→s
IfEnd
Next
Next
Next
Next
Next
Next

Результат 55252 1час 36мин

SHARP PC-G850S
main() {
int x,y,z,a,b,c,n=9;
long s=0;
for(x=0;x<=n;x++) {
for(y=0;y<=n;y++) {
for(z=0;z<=n;z++) {
for(a=0;a<=n;a++) {
for(b=0;b<=n;b++) {
for(c=0;c<=n;c++) {
if (x+y+z==a+b+c)
s++;
}
}
}
}
}
}
printf (“s=%d “,s);
}
Результат s=55252 22мин 54c

С оптимизацией
SHARP PC-G850S
main() {
int x,y,z,a,b,c,k=0,n=9;
long s=0;
for(x=0;x<=n;x++) {
for(y=0;y<=n;y++) {
for(z=0;z<=n;z++) {
for(a=0;a<=n;a++) {
for(b=0;b<=n;b++) {
k=0;
for(c=0;c<=n;c++) {
if (x+y+z==a+b+c){
k=1;s++;break;}
}
if ((k==1)&(c==0))
break;
}
if ((k==1)&(b==0)&(c==0))
break;
}
}
}
}
printf (“s=%d “,s);
}
Результат s=55252 13мин 22c

C оптимизацией
Casio 9750 GII
0→s
For 0→x to 9
For 0→y to 9
For 0→z to 9
For 0→a to 9
For 0→b to 9
0→k
For 0→c to 9
If (x+y+z)= (a+b+c):then
1→k :s+1→s:Break
IfEnd
Next
If k= 1 and c=0: then
Break
IfEnd
Next
If k= 1 and c=0 and b=0: then
Break
IfEnd
Next
Next
Next
Next

Результат 55252 56мин 05с

HP35s для 4-значных билетов: 20 минут

01 LBL H      15 RCL W      29 STO Z   
02 9e-3       16 IP         30 ISG Y   
03 STO A      17 RCL V      31 GTO H010
04 STO Z      18 IP         32 RCL A
05 STO Y      19 +          33 STO Y
06 STO W      20 x!=y?      34 ISG W
07 STO V      21 GTO H026   35 GTO H010
08 0          22 RCL T      36 RCL A
09 STO T      23 1          37 STO W
10 RCL Z      24 +          38 ISG V
11 IP         25 STO T      39 GTO H010
12 RCL Y      26 ISG Z      40 VIEW T
13 IP         27 GTO H010   41 RTN   
14 +          28 RCL A 

T = 670.0000

Для 6-значных билетов, в идеальном случае: 20х100 минут или 33 часа с половиной часа, тестировать я поленился.

UPDATE:
Из теста 8-ферзей:
http://pmk.arbinada.com/node/30

N-Queens Problem
4:17       HP-35S           Keystroke / RPN
15.3       MK-161           Keystroke / RPN / Ver.1.03

МК-161 с той прошивкой быстрее hp35s в 16.8 раз. Исходя из этого, "Счастливые билеты" для HP35s для 6 цифр должны быть около 1550 минут.

В любом случае HP35s тормоз чуть менее чем полностью.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Совпадает и с тестом "Пустой цикл". Такое впечатление, что эмулятор, гоняющий прошивку прежнего HP35 поверх нового камня, еле ворочается.

это объясняет, конечно. Да, на что-то серьезное hp35s не годится.

5800P (между которым и HP35s я колебался при покупке последнего) не сказать, что сильно быстрее, судя по 8-ферзям:

4:17         HP-35S            Keystroke / RPN
3:47         FX-5800P          Formula / Array

После этого 29 секунд целочисленного Форта в микроконтроллере впечатляют.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Хороший калькулятор - свой калькулятор. Это следует из принципа "хочешь сделать хорошо - сделай сам".

Да, свой калькулятор лучше. Форт или Рапира :)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Программа для HP-50g на UserRPL.

<<
  TICKS #0d
  #0d #9d FOR A
    #0d #9d FOR B
      #0d #9d FOR C
        #0d #9d FOR D
          #0d #9d FOR E
            #0d #9d FOR F
              A B C + +
              D E F + +
              IF == THEN
                #1d +
              END
            NEXT   
          NEXT   
        NEXT   
      NEXT   
    NEXT   
  NEXT   
  SWAP TICKS SWAP - B->R 8192. /
  400 2 BEEP
>>

Результат:
# 55252d
16963.7645264, то есть 282 минуты

P.S. Ждем выхода newRPL :)

Ого, патриарх-то тоже тормоз :)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Слишком много уровней трансляций:
UserRPL->SysRPL->Saturn->Asm

Судя по тесту "Пустой цикл", на SysRPL должно быть 6 минут. На сатурновском ассемблере - еще на порядок меньше, не говоря уже о долях секунд на C.

Сила HP50g в том, что можно и так, и этак и по-другому и даже еще вот как.

"::
 CLKTICKS BINT0 BINT0 BINT0 BINT0 BINT0
 { NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM }
 BIND 
 BINT10 ZERO_DO
 INDEX@ 4PUTLAM
 BINT10 ZERO_DO
 INDEX@ 3PUTLAM
 BINT10 ZERO_DO
 INDEX@ 2PUTLAM
 BINT10 ZERO_DO
 INDEX@ 1PUTLAM
 BINT10 ZERO_DO
 BINT10 ZERO_DO
 5GETLAM
 4GETLAM 3GETLAM 2GETLAM #+ #+
 1GETLAM JINDEX@ INDEX@ #+ #+
 #= IT #1+ 5PUTLAM  
 LOOP
 LOOP
 LOOP
 LOOP
 LOOP
 LOOP
 5GETLAM
 6GETLAM
 ABND
 CLKTICKS
 SWAP bit- HXS>% % 8192 %/
;
@"

Результат:
¤ 55252d
859.24597168, то есть 14 минут 19 секунд

Спасибо, все добавил

"::
 CLKTICKS BINT0
 { NULLLAM NULLLAM }
 BIND 
 BINT10 ZERO_DO
 INDEX@
 BINT10 ZERO_DO
 DUP INDEX@ #+
 BINT10 ZERO_DO
 DUP INDEX@ #+
 BINT10 ZERO_DO
 DUP INDEX@ #-
 BINT10 ZERO_DO
 DUP INDEX@ #-
 BINT10 ZERO_DO
 DUP INDEX@ #= IT :: 1GETLAM #1+ 1PUTLAM ; 
 LOOP
 DROPLOOP
 DROPLOOP
 DROPLOOP
 DROPLOOP
 DROPLOOP
 1GETLAM
 2GETLAM
 ABND
 CLKTICKS
 SWAP bit- HXS>% % 8192 %/
;
@"

Результат:
¤ 55252d
320.372192383, то есть 5 минут 20 секунд

Если условие переписать:

 DUP INDEX@ #= IT :: 1GETLAM #1+ 1PUTLAM ISTOP@ INDEXSTO ;

то результат:
¤ 55252d
282.681762695, то есть 4 минуты 43 секунды

Вот теперь время соответствует соотношению в тесте пустого цикла, а то 14 минут долго. Округлил до 5 минут. На сатурновском ассемблере будет еще на порядок быстрее, в пределах минуты.

Всё же последние версии программы оптимизированы, за счёт использования ранее вычисленных сумм цифр. Просто при использовании стека это делается органично и, как бы, не заметно. Поэтому рекомендую оставить 14 минут для не оптимизированной версии.

Последняя оптимизация - взята из примера Ardo_79:
Условие:

DUP INDEX@ #= IT :: 1GETLAM #1+ 1PUTLAM
   INDEX@ #0= IT :: JSTOP@ JINDEXSTO ; ISTOP@ INDEXSTO ;

выдает:
¤ 55252d
244.788330078, то есть 4 минуты 5 секунд.
Если вместо ISTOP@ и JSTOP@ использовать BINT10, то время выполнения ещё сократиться на 3,5 секунды.

Если использовать FEVAL (повышение частоты до 200 МГц) - то самая оптимизированная версия выполнится за 171,3600107422, то есть 2 минуты 51 секунду.

Оптимизация - это избавление от циклов или вхождений в них по предусловию. Использование стека - документированная стандартная возможность данных ПМК, такая же, как использование FL0..FL3 в МК61.

Оптимизация - это любые мероприятия приводящие к сокращению времени выполнения программы. Иногда это делает человек, иногда компьютер (компилятор+Acovea). Ничто не мешает использовать частичные суммы в программах для калькуляторов Casio и Sharp. Время вычислений сократиться существенно.

Оптимизация бывает двух видов: алгоритмическая и техническая. Техническая предусматривает написание программы по заданному алгоритму с использованием всех технических возможностей устройства.

Если вы меняли алгоритм, то тогда да, такая оптимизация не соответствует условиям первой части тестов. Но, насколько я вижу, там по-прежнему 6 вложенных циклов без предусловий, т.е. осуществляется полный перебор. Или я что-то упускаю из виду?

Обязательное условие алгоритма - полный перебор всех вариантов, а как его реализовать - дело программиста.

сравнить скорость вычислений калькуляторов, что имеет смысл только при одинаковом кол-ве арифметических операций. Вот только сейчас проверил, что делает оптимизатор gcc с опцией -O2 с нашими вложенными циклами.

ИЗ:

for (a = 0; a < 10; ++a)
  for (b = 0; b < 10; ++b)
    for (c = 0; c < 10; ++c)
      for (d = 0; d < 10; ++d)
        for (e = 0; e < 10; ++e)
          for (f = 0; f < 10; ++f)
            if( a+b+c == d+e+f )
  	      S+=1;

ПОЛУЧАЕТЬСЯ:

for (a = 0; a < 10; ++a)
  for (b = 0; b < 10; ++b) {
    ab = a + b ;
    for (c = 0; c < 10; ++c) {
      abc = ab + c ;
      for (d = 0; d < 10; ++d)
        for (e = 0; e < 10; ++e) {
    	  de = d + e ;
          for (f = 0; f < 10; ++f)
            if( abc == de + f )
		S+=1;
	}				
    }
  }

P.S. GCC меня переиграл :)

Можно f сравнивать с abc-de, да и вообще от de избавиться.

Дальше уже пойдёт то, что Арбинада не любит — вместо самого внутреннего цикла сравнивать, укладывается ли abc-de в диапазон [0;9].

Casio fx-9860G Slim
Результат: 55252 46мин 48с ( Программа аналогична Casio fx-9750G II c оптимизацией)

Casio fx-9860G SD
Результат: 55252 49мин 07с ( Программа аналогична Casio fx-9750G II c оптимизацией)

Программы для разных калькуляторов, увы, кодируют разные алгоритмы и поэтому выполняются за разное время.

Вот самый быстрый алгоритм прямого перебора, укладывающегося в условие задачи. Реализовав его для своего любимого калькулятора, можно немножко приподнять его в топе. :-)

int a,b,c, d,e,f, ab, abc, h, S;

S = 0;
for (a = 0; a < 10; ++a)
  for (b = 0; b < 10; ++b)
  { ab = a + b ;
    for (c = 0; c < 10; ++c)
    { abc = ab + c ;
      for (d = 0; d < 10; ++d)
      { g = abc - d;
        for (e = 0; e < 10; ++e)
    	{ h = g - e ;
          for (f = 0; f < 10; ++f)
            if ( f == h )
		++S;
	}
      }	
    }
  }
Печать (S);

реализовано мной в программе для HP-50g на SysRPL. Но, вариант GCC получше на одну переменную, что позволяет их все разместить в регистрах. Единственное улучшение, - это циклы с декрементом, так как сравнение с нулем обычно быстрее.

P.S. 2:0 в пользу GCC :-)

Опираясь на Ваш алгоритм можно существенно оптимизировать предыдущую программу

С оптимизацией
SHARP  PC-G850S
main() {
int  x,y,z,a,b,c,xy,xyz,g,h,n=9;
long  s=0;
for(x=0;x<=n;x++){
   for(y=0;y<=n;y++) {
   xy=x+y;
      for(z=0;z<=n;z++) {
       xyz=xy+z;
         for(a=0;a<=n;a++) {
          g=xyz-a;
            for(b=0;b<=n;b++) {
            h=g-b;
               for(c=0;c<=n;c++) {
	 if (h==c){
         s++;break;}
               }
         if ((h==c)&(c==0))
         break;
         }
          if ((h==c)&(b==0)&(c==0))
         break; 
       }
      }
    }
   }
    printf (“s=%d “,s);
}

Результат s=55252 8мин 37c

Циклы «с нулём» действительно быстрее. Вот псевдокод, в котором переменные цикла сравниваются с нулём.

int a,b,c, d,e,f, ab,abc, g,h, S;

S = 0;
for (a = 9; a >= 0; --a)
  for (b = 9; b >= 0; --b)
  { ab = a + b ;
    for (c = 9; c >= 0; --c)
    { abc = ab + c ;
      for (d = 9; d >= 0; --d)
      { g = abc - d;
        for (e = 9; e >= 0; --e)
    	{ h = g - e ;
          for (f = 9; f >= 0; --f)
            if ( f == h )
		++S;
	}
      }	
    }
  }
Печать (S);

Если важно экономить регистры (уменьшить количество переменных), можно использовать ab, abc, g и h в качестве переменных циклов напрямую — избавившись от более очевидных (для читателя программы) b, c, d и e. Конечно, инициализация переменной цикла станет сложнее, как и условие окончания цикла. Зато в циклах не будет лишней арифметической операции.

Вот этот псевдокод:

int a,f, ab,abc, g,h, S;

S = 0;
for (a = 9; a >= 0; --a)
  for (ab = a+9; ab >= a; --ab)
    for (abc = ab+9; abc >= ab; --abc)
      for (g = abc-9; g <= abc; ++g)
        for (h = g-9; h <= g; ++h)
          for (f = 9; f >= 0; --f)
            if ( f == h )
		++S;
Печать (S);

Всё таки машины пока ещё не могут достичь пределов человеческого ума в некоторых задачах :)

Конечно быстрее! Любой, хоть раз писавший на ассемблере, мог убедиться в этом на своем опыте. По исходной ссылке на тест для компиляторов приведен ассемблерный код в качестве "минимально плохого".

Оптимизирующие компиляторы обычно превращают инкрементный цикл в декрементный без вмешательства человека. Даже Delphi.

По-идее, хороший компилятор должен еще последний цикл заменить простой проверкой.

Подобрал хорошие названия для двух оставшихся переменных, заменив g и h на ef и ff. Кому-нибудь интересно сделать тест «Счастливые билеты» для Каллисто? :-) Я могу проверить и измерить быстродействие на «железе», если у вас почему-то ещё нет МК-161.

int a,b,c, d,e,f, ab,abc, ef,ff, S;

S := 0;
for (a := 9; a >= 0; --a)
  for (b := 9; b >= 0; --b)
  { ab := a + b ;
    for (c := 9; c >= 0; --c)
    { abc := ab + c ;
      for (d := 9; d >= 0; --d)
      { ef := abc - d;
        for (e := 9; e >= 0; --e)
    	{ ff := ef - e ;
          for (f := 9; f >= 0; --f)
            if ( f == ff )
		++S;
	}
      }	
    }
  }
Печать (S);

Короткий и быстрый вариант с выносом арифметики из тела цикла в инициализацию:

int a,f, ab,abc, ef,ff, S;

S := 0;
for (a := 9; a >= 0; --a)
  for (ab := a+9; ab >= a; --ab)
    for (abc := ab+9; abc >= ab; --abc)
      for (ef := abc-9; ef <= abc; ++ef)
        for (ff := ef-9; ff <= ef; ++ff)
          for (f := 9; f >= 0; --f)
            if ( f == ff )
		++S;
Печать (S);

<< TICKS 0 'S' LSTO
0 9 FOR 'A'
  0 9 FOR 'B'
    0 9 FOR 'C'
      0 9 FOR 'D'
        0 9 FOR 'E'
          0 9 FOR 'F'
            A B C + +
            D E F + +
            IF == THEN
              'S' INCR DROP
            END
          NEXT   
        NEXT   
      NEXT   
    NEXT   
  NEXT   
NEXT   
TICKS SWAP - 1E6 / S SWAP
>>

Вывод:
55252
37.6 секунд

Версия с использованием ранее вычисленных сумм - 23,4 секунды :)

<< TICKS 0 'S' LSTO
0 9 FOR 'A' A
  0 9 FOR 'B' DUP B +
    0 9 FOR 'C' DUP C +
      0 9 FOR 'D' DUP D -
        0 9 FOR 'E' DUP E -
          0 9 FOR 'F' DUP F -
            0 IF == THEN
              'S' INCR DROP
            END
          NEXT   
        DROP NEXT   
      DROP NEXT    
    DROP NEXT   
  DROP NEXT   
DROP NEXT   
TICKS SWAP - 1E6 / S SWAP
>>

P.S. Интерфейс у newRPL пока неудобный.

Почитал на форуме HP про newRPL.

Похоже на то, что мы планируем с Каллисто — на том этапе, когда будем переносить её в W77LE516P. Разве что у англоязычных лучше знание аппаратуры HP 50g, т.к. HP в отличии от самобытной СЕМИКО не засекречивает от владельцев калькуляторов используемую прошивку.

Впрочем, фирменная прошивка использовалась в newRPL лишь как источник информации о том, как работает железо HP 50g. Сам закопирайченный исходный код любителями не используется. И правильно делают, известны случаи наездов западных корпораций на тех, кто поступает иначе.

Главное — у зарубежного сообщества появится свободный (и переносимый) код калькулятора с newRPL. Который можно будет использовать при написании приложений, создании собственного оборудования и т.п.

Некоторые подходы newRPL интересны. Но его разработчики отталкиваются от уже гораздо более развитого языка, чем язык МК. Да и вычислительные ресурсы в их распоряжении на поколения больше, 200 МГц 32-битного процессора против 22 МГц 8-битки.

          0 9 FOR 'F' DUP F -
            0 IF == THEN
              'S' INCR DROP
            END

А вот так не получится?

          0 9 FOR 'F' DUP F
            IF == THEN
              'S' INCR DROP
            END

Хотя синтаксис newRPL здесь уродлив, конечно. IF в Форте достаточно хорош. Если заимствовать из Модулы-2, то не синтаксис IF, а разделение модулей на интерфейс и реализацию (инкапсуляция по Вирту).

Я уже давно думаю, как эту модульность можно реализовать в Каллисто. Пока пасьянс не сложился. Возможно, здесь тоже задачка на несколько десятилетий.

но я уже вернул родную прошивку. newRPL пока сыроват, но скорость впечатляет. Кроме HP-50g newRPL могут портировать на HP Prime. Вот это будет бомба. А мы и так справимся - Путь домой

Сделал тест "счастливых билетов" под мультиклетовский си-компилятор:

//schastlivye bilety
#include 
#include 
void main()
{
	int a;
  int b;
  int c;
  int d;
  int e;
  int f;
  int g;
  int h=0x00007000;
	WDT_OFF;
  while(1)
  {
    GPIOD->DIR = ((uint32_t)0x00007000);
    GPIOD->OUT = ((uint32_t)h);
    g=0;
    for (a=10; a>=1; a--)
    {
      for (b=10; b>=1; b--)
      {
        for (c=10; c>=1; c--)
        {
          for (d=10; d>=1; d--)
          {
            for (e=10; e>=1; e--)
            {
              for (f=10; f>=1; f--)
              {
                if ((a+b+c)==(d+e+f)) g++;
              }
            }
          }
        }
      }
    }
    if (g==55252)
    h^=0x00007000;
  }
}

Результат ажно 0,84 секунды при тактовой частоте процессора 80МГц, получившееся быстродействие порядка 10млн. операций в секунду, это очень мало! Ежели выкинуть выражение if ((a+b+c)==(d+e+f)) g++; то время выполнения программы падает вдвое, всё-таки распараллеливание операций по клеткам есть, но сама компиляция организована не лучшим образом! Даже если учесть отсутствие распараллеливания из-за циклов, то производительность должна быть всё равно минимум почти на порядок выше!
Вердикт: пока лучше грызть ассемблер!

Оптимизировал алгоритм, время расчёта уменьшилось до 0,78с:

//schastlivye bilety
#include 
#include 

void main()
{
	int a;
  int b;
  int c;
  int d;
  int e;
  int f;
  int g;
  int h=0x00007000;
  int i;
  int j;
  int k;
	WDT_OFF;
	
  while(1)
  {
    GPIOD->DIR = ((uint32_t)0x00007000);
    GPIOD->OUT = ((uint32_t)h);
    g=0;
    for (a=10; a>=1; a--)
    {
      for (b=10; b>=1; b--)
      {
        i=a+b;
        for (c=10; c>=1; c--)
        {
          j=i+c;
          for (d=10; d>=1; d--)
          {
            for (e=10; e>=1; e--)
            {
              k=d+e;
              for (f=10; f>=1; f--)
              {
                if (j==(k+f)) g++;
              }
            }
          }
        }
      }
    }
    if (g==55252)
    h^=0x00007000;
  }
}

Сделал "Счастливые билеты" на мультиклетовском асме, я прямо в недоумении от результата... Порядка 30 млн. оп./с. Ещё особенность программрования на асме вылезла - внутри микропрограммы не должно быть больше одной ссылки на одну микропрограмму, а также больше одной ссылки на один и тот же регистр. Может быть ветвление, но со ссылками на разные микропрограммы. Можно подумать по оптимизации программы, но похоже сильно много не выжмешь, миллион пустых циклов выполняются за 0,22 секунды, всё равно как-то не вяжется с 80МГц. Похоже время жрёт подгрузка микропрограмм в ядро. Операнды целочисленные, использовались только регистры общего назначения.

Тест на ардуине к моему изумлению дал 0,78с при частоте ATMega328P 16МГц!

int led = 13;
byte a;
byte b;
byte c;
byte d;
byte e;
byte f;
word g;
boolean h=false;
byte i;
byte j;
byte k;
void setup() {
  pinMode(led, OUTPUT);
}
void loop() 
{	
    g=0;
    for (a=10; a>=1; a--) {
      for (b=10; b>=1; b--) {
        i=a+b;
        for (c=10; c>=1; c--) {
          j=i+c;
          for (d=10; d>=1; d--) {
            for (e=10; e>=1; e--) {
              k=d+e;
              for (f=10; f>=1; f--) {
                if (j==(k+f)) g++;
              }
            }
          }
        }
      }
    }
    if (g==55252) 
    h=!h;
    digitalWrite(led, h);
}

А вот миллион пустых циклов выполняется ажно 6 секунд, так что ардуиновый компилятор весьма неоднозначен.

В России весной 2017 выпустили отечественную плату на основе миландровского микроконтроллера марки К1986ВЕ92QI, а в качестве IDE разработчики платы взяли бесплатную NetBeans со своими дополнениями.

Время выполнения теста при тактовой частоте 80МГц составило 0,105с, то есть всего 105мс! В среднем, на выполнение главного цикла уходит шесть операций, плюс операция на внешние циклы, то получается, что результирующее быстродействие на уровне 67 млн. оп/с, то есть, по тактам, порядка 83% от теоретического, хотя если считать по даташиту в 1,25 млн. оп./с. на 1МГц, то выходит 67% теоретического быстродействия!

#include "main.h"
#include "stdlib.h"
#include "stdio.h"
#include "mstn_led.h"

uint a;
uint b;
uint c;
uint d;
uint e;
uint f;
uint g;
//uint h;
uint j;
uint i;
uint k;
    
void bilety();

int main()
{
    LED_SetGreenState(TURN_ON);
    while(1)
    {
        bilety();
        if (g==55252)
        LED_SetRedState(TURN_ON);
        if (g==55252)
        bilety();
        LED_SetRedState(TURN_OFF);
    }
    return EXIT_SUCCESS;
}

void bilety()
{
    g=0;
    for (a=10; a>=1; a--)
    {
        for (b=10; b>=1; b--)
        {
            i=a+b;
            for (c=10; c>=1; c--)
            {
                j=i+c;
                for (d=10; d>=1; d--)
                {
                    for (e=10; e>=1; e--)
                    {
                        k=d+e;
                        for (f=10; f>=1; f--)
                        {
                            if (j==(k+f)) g++;
                        }
                    }
                }
            }
        }
    }
}

Поскольку флешпамять микроконтроллера имеет задержку в четыре такта, хоть и разбита на четыре параллельно работающих банка, я думаю, что код программы компилятор вполне мог поместить в оперативную память микроконтроллера. Кстати, есть один тонкий момент, у ядра ARM Cortex-M3 есть несколько команд, выполняющих по две операции за такт, например умножение плюс сложение, поэтому такие впечатляющие результаты могут получаться за счёт архитектурных особенностей микроконтроллера. Впечатляюще, не правда, ли?

Результат рассчитывается честно, не 55251, и не 55253, а честных 55252 билета)

Добавлено. Разобрался с функциями и переменными, выложил обновлённый тест, результаты прежние.

Исправлено. Убраны вводящие в заблуждения результаты, полученные в результате ошибки в программе расчёта миллиона пустых циклов, из-за которой я сделал неправильные выводы.

Попробуй полностью отключить оптимизацию у компилятора. Там наверняка GNU C, он с этой задачкой справляется на уровне -o2 очень неплохо.

Пробовал я вместо набора команд С11 ставить С89 и С99, вместо режима оптимизации О2 ставил О0, результаты такие же. А потом я вместо 80МГц поставил 16МГц и что же?! Тоже самое, и нагрев кристалла остался прежним! Похоже, настроенный интэковцами компилятор нагло игнорит все мои поползновения в сторону уменьшения оптимизации при компиляции программы. Добавлю, что в Кейле тактовая частота действительно устанавливалась 16МГц и микросхема была холодной.

Нашёл ошибку в программе миллион пустых циклов! Вместо миллиона пустых циклов программа выполняла миллион включений или выключений светодиода, а поскольку неэффективный алгоритм включения/выключения единичного пина даёт задержку, то и получалось резкое увеличение времени выполнения.

А вот написание программы выполнения миллионов пустых циклов, не дало возможности измерить период выполнения, период расчёта можно измерить только осциллографом или частотомером. По-видимому интеллекта оптимизатора хватает на то, чтобы обратить внимание на миллион пустых вычислений, и, по-видимому, в готовой программе меняется алгоритм, для подгонки результата! Поэтому миллион пустых циклов можно считать заведомо не пригодным для оценки эффективности компиляторов, которые его могут просто обходить.

Прошу извинения за ошибочную оценку. И никто мордой не ткнул)

Допущенная ошибка в попытке оценить время выполнения миллиона пустых циклов дала интересный побочный результат. Миллион операций вывода одного дискретного бита в порт микроконтроллера на основе библиотеки stdio.h выполняется за 0,84с то есть порядка 1,2 млн оп. выв. /с. Если оценить затраты на цикл в три операции, то выходит, что функция вывода в порт выполняется от 20 (по тактам) до 25 (по даташиту) операций!

#include "main.h"
#include "stdlib.h"
#include "stdio.h"
#include "mstn_led.h"

int main()
{
    uint a;
    LED_SetGreenState(TURN_ON);
    while(1)
    {
        a=0;
        for (a=1000000; a>=1; a--)
        LED_SetRedState(TURN_ON);
        a=0;
        for (a=1000000; a>=1; a--)
        LED_SetRedState(TURN_OFF);
    }
    return EXIT_SUCCESS;
}

Добавлено.

Скомпилировал вот такой код:

#include "main.h"
#include "stdlib.h"
#include "stdio.h"
#include "mstn_led.h"

int main()
{
    uint a;
    LED_SetGreenState(TURN_ON);
    while(1)
    {
        a=0;
        for (a=1000000; a>=1; a--);
        LED_SetRedState(TURN_ON);
        a=0;
        for (a=1000000; a>=1; a--);
        LED_SetRedState(TURN_OFF);
    }
    return EXIT_SUCCESS;
}

Итого, время выполнения цикла... 2деления х 2мкс/дел х 0,2 множитель развертки, итого... 0,8мкс... В общем, затраты времени только на операцию вывода бита в порт.

фото

Прошу специалистов прокомментировать код, по-моему где-то я ошибся.

Не рассматривали такую особенность современных ARM-ов? Это сильно может сбить ввод-вывод.

А как конвейер может уменьшить выполнение функции for (a=1000000; a>=1; a--); до ста тактов? Где я ошибся?

вообще выбросить ваш пустой цикл из бинарника

Пустой цикл был нужен для оценки быстродействия скомпилированной программы по сравнению со "Счастливыми билетами", видимо компилятор действительно заменяет миллион пустых циклом, одним с вычетом миллиона вместо декремента.

Ватник wrote: вообще выбросить ваш пустой цикл из бинарника

А это легко проверить - посмотреть lst файл.

Электромонтёр wrote: А как конвейер может уменьшить выполнение функции for (a=1000000; a>=1; a--); до ста тактов? Где я ошибся?

Предсказание переходов, очень даже может.

Электромонтёр wrote: В России весной 2017 выпустили отечественную плату

А сколько стоит сия плата?

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

2500 рублей без стоимости доставки

Всё ещё в разы дороже STM32 при тех же или более слабых возможностях. Это рыночный проект или развлечение ? Я понимаю негодование Арви по поводу зажимания своей промышленностью иностранными разработками, но так как у нас рыночная экономика, странно не учитывать рыночной конкуренции и слепо производить заведомо убыточные вещи ! Посмотрите не конструктор "Знаток" например "Умная машина", взяли и подобные штуки запаковали в набор детских деталей на одёжных кнопках и сразу конкуренция с зарубежными вещами поугасла, Lego со своими EV3 крутится в другой нише. Не знаю. что там за микроконтроллеры у Знатока, распознают голосовые команды и управляют двигателями, считывая УЗ датчики, всё залито чёрным компаундом, но скорее всего не по 1000 рэ за штуку, т.к. весь набор с кучей ништяков, включая классную коробку укладывается по себестоимости судя по всему тыщи в 3. А тут галимая платка за 2500, бугага!

Это тест компилятора, который показал вполне обнадёживающие результаты.

Если посмотреть сколько стоит хотя бы отечественный аналог AVR, то этот ARM вполне на уровне. И потом надо сравнивать не цены на Али, а родные отечественные магазины которые платки с STM32 задвигают тоже за здорово живешь.

задвигает по 350 рублей Cortex-M3 STM32F103C8T6
а STM8 вообще по 120 рублей штука. В ЧипДипе !!! я купил по 40 рублей штука горсть STM32F100 в микроскопическом 32-ногом корпусе, к которому есть печатные платки для пайки. В итоге стоимость одной платки с 32-битным ARM микроконтроллером может не превышать 100 рублей, или 40 рублей, если его присобачить куда то сразу.
Так что эти ваши по 1000 рублей никому не нужны, кроме 1.5 патриотов со странностями в предпочтениях.

Была бы это реально альтернативная ARMу архитектура, типа Эльбрус или этот ваш мультиклет, то я бы брал по такой цене (но не дороже) из любопытства.

Здесь не столько эмоции, сколько другая категория.

Например, можно пойти в магазин закупиться «едой» — и хлеб за 15 рублей выгодней торта за 600 рублей. А можно пойти за куриными яйцами для яичницы или бизе. При этом более дешёвая картошка как-то не соблазняет.

Есть сцена калькуляторов. Есть сцена мобильных телефонов. А есть сцена — отечественные технологии. Некоторых она привлекает.

Я понимаю, что работникам военных заводов сложно представить, что кто-нибудь делает по зову сердца то, что им предписывают жёсткие инструкции. Когда заставляют, всегда есть желание расслабиться и сваять что-нибудь на дешёвой китайской хрени.

Но некоторые хотят расово чистую электронику просто из любви к искусству. И готовы доплачивать за «отечественность», как любитель античности доплачивает за подлинные греческие статуи. Конечно, даже миллионерам всегда хочется, чтобы товар был дешевле. Но не за счёт того, что вместо античного фарфора тебе продадут китайскую пластиковую подделку.

Пусть даже у китайской «Венеры» будет обе руки, да ещё с отверстиями для презервативов — всегда найдутся культурные люди, которые предпочтут изучать Венеру Милосскую. Также и с «Электроникой МК-161», которая по производительности или габаритам может уступать «зарубежным аналогам» — всегда в России (и не только) будут люди, которым дорога именно МК-161 или то, что придёт ей на смену.

- это дорогая "китайская хрень". То есть что то менее качественное, чем у китайцев, но в 3-4 раза дороже. А МК-161 так вообще сделана целиком из дешёвой китайской хрени, был бы из отечественных компонент стоило бы не ~15 килорублей, а 115 :-)

Милистоун тому подтверждение, как там 2500 получилось?

В данном случае как раз говорим о "кортексе", который наш ну процентов на 90, а то и больше на 95. Чего бы его не воткнуть в МК-161?

Вот в МК-85 стоит например почти что SoC - КА1013ВМ1. Его конечно сейчас не достать, не купить, не произвести. При том что 1806ВМ2 например свободно достается и не только с заводских запасов. Это я про то что не захотел никто даже в ретро калькуляторы использовать, даже любители. Ну и где эти расово чистые модели электроники? Милистоун как раз будет расово чище любой МК-161. Не Арви, МК-161, используют не из любви к отчизне, и количество пользователей сокращается, а не растет. Я думаю было так люди взяли на волне ностальгии и в основном для коллекции. О том что там внутри тогда никто и не думал, так как своей электроники не было совсем, уже даже что то сделанное в России, питало нежные чувство патриота. Но время идет, отечественная электронная промышленность худо бедно может уже что то дать игрокам рынка свое - ну вот Мландровский кортекс например или Элвисовские элькоры, да хрен с ним даже непонятный никому мультиклет. По вполне приемлемым ценам. Почему не видно реплик МК-61/52/85/90 ???? Любители у нас есть, даже могут осуществить выпуск единственного экземпляра, но потенция не есть реальность. Вот объясните этот феномен? Комерсов тут смысла ждать нет, они не придут даже с зарубежной базой.

Отечественный кортекс 3м не воткнуть в МК-161 потому что он стоит конских денег и все остальные детали всё равно будут зарубежными. А МК-161 и так уже стоит около 15 тыр.
ИМХО надо не на расовую чистоту давить, а на реальный функционал и довольных пользователей. Что толку от расово чистого ПМК, если он размером с гроб и имеет схожий функционал ?

Для 15 тыр за кальк, 1000 рублей за миландр в единичном экземпляре вообще не цена! Задумайтесь это даже не покупка 10 штук, а только 1! 15 тысяч рублей покроют использование внутри МК-161 даже чертового Атома! Посмотрите стоимость свистков на атоме на Али.

Если, а так оно и есть, Арви давит на расовую чистоту (херовое понятие конечно), то МК-161 ни образец этой частоты, это даже не "метис", это чистокровный иностранец.

Согласен, «отечественный» кортекс улучшит производительность. Стоимость 15 или 16 т.р. это не так принципиально.

Но дополнительных баллов за «отечественность» он не принесёт, калькулятор более чистокровным не станет. Как 8051 изначально американская выдумка, как и ARM разработка Британии. Улучшение будет только в том, где «камень» физически изготовлен — здесь или в Китае. Конечно, если Миландр свои процессоры не в Китае изготавливает.

Я надеюсь что по поводу Acorn ARM v1 никто не заблуждается, а коли так то ARM по архитектуре чистый американец - DEC, Apple какие еще могут быть вопросы? Ну а взять и купить лицензию России мне кажется не умоляет заслуг Миландра, тем более что пекут то не в Китае а в Зеленограде, ну может "разваривают" кристалл в Китае, не знаю наверняка.

С какого перепуга "ARM по архитектуре чистый американец" и каким тут боком DEC и Apple ?

МК-161 это самое близкое к «расово чистому» калькулятору. И пока с ним некому в расовой чистоте соревноваться. Разве что в США выпускают устройства, более расово чистые — но для американской расы.

На вопрос же уже тысячи раз отвечал. Путинисты захватили власть. И как они не дают пробиться на выборы кандидатам, которые могут победить Путина — точно также и производство в России наладить людям без стукачества на Лубянку и участия в бандах типа НОД Фёдорова, ЕР Медведева сейчас очень сложно. Уничтожим Путина, будет расцвет и отечественной электроники, и производства вообще.

Я думаю было так люди взяли на волне ностальгии и в основном для коллекции.

Да. Примерно из таких соображений и выбирают отечественное. Например, эмигранты из Германии могут пользоваться немецким фарфором и это даёт им какие-то приятные ощущение.

Напомню также, что для меня система команд, архитектура важнее места производства. То есть система команд МК-161 «расово чистая», а вот процессор недостаточно «расово чистый». И даже не за счёт производства в Китае, а за счёт имитирования американской архитектуры 8051. Но замена его на более производительный Atom ухудшит «расовую чистоту», т.к. Atom Россия производить не умеет.

"Расовая чистота" в отношении процессоров звучит немного неожиданно. Особенно если подумать о корнях людей, которые работали и работают в составе корпораций, двигающих научно-технологический прогресс планеты Земля.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Что 8051 что КР1878 сиречь изначально импортные разработки, с одним только отличием, что первый был "творчески переработан" еще в СССР, а второй - просто купили лицензию. Но оба производятся тут. В чем разница?

Интересно, а какой был прототип КР1878ВЕ1?

Хотя я имел ввиду 1986ве92, конечно.

Нет, у пика совершенно другая архитектура, хотя по ногам КР1878ВЕ1совпадает с PIC16F84. А для 1986ВЕ92 Миландр вполне официально ядро лицензировал и британским учёным процент с продаж кристаллов отчисляет.

судя по всему, от PICа там кой что есть - встроенный стек возвратов, один аккумулятор, регистровый файл.
А так конечно, творческая переработка, IMHO.

Допустим, я согласен бескорыстно "стучать" о бездомных псах, которые постоянно шарятся по моей улице, у каждого есть имя и своя история, несомненно - это очень ценная информация и за неё мне позволят держать своё электронное производство. Страшно подумать, что делать тем, кому не о чём "стучать" :-)

архитектура важнее места производства

А я о чём твержу всё время - то что вы вносите в железяку - это и определяет её "национальность", а не где и какими китайцами она спаяна и прошита ! Ну естественно внешний и внутренний дизайн железяки тоже важен, но на вершине всего "архитектура софта", она то и определяет всё.

Atom Россия производить не умеет.

России никакие современные процессоры производить не умеет, на настоящих электронных конкурентоспособных производствах никто не использует ничего из российской номенклатуры, иначе мгновенно обанкротятся. И я не знаю ответа на вопрос, на кой вообще России это уметь ??? Какова экономическая целесообразность в мире Intel,AMD,и прочих производителей ARM и т.п. уметь производить процессоры для гражданских нужд ? Почему Финляндия не умеет производить АЭС и подводные лодки ? Кто нибудь слышал про французские процессоры ??? Или мы таки враги и надо рассчитывать на взаимное уничтожение ? Вся эта кутерьма мне давно не даёт покоя. Почему наши заокеанские "друзья" ведут себя как последние подонки и используют надуманные политические лозунги для прикрытия экономической агрессии ? Впрочем, для малого предпринимателя этот вопрос не имеет смысла, т.к. на рынке надо выживать, а российская электронная промышленность не даёт возможности выживать даже патриотам из СЕМИКО.

Ватник wrote: Почему Финляндия не умеет производить АЭС и подводные лодки ?

Глубоководные аппараты "Мир", (глубина погружения до 6 км, те самые батискафы, которые использовались во время съемок фильма "Титаник"):

"В 1982 году Академия наук СССР предложила заказ трём другим возможным изготовителям. Когда шведские и французские предприятия отказались от предложения, осталась фирма Раума-Репола со своим дочерним предприятием Oceanics — Финляндия не подписывала договор о запрете экспорта в СССР передовых технологий. Мирный договор запрещал владение подводными лодками и их строительство, но этот параграф касался только военной техники, а заказанные аппараты были научно-исследовательскими."

"Руководитель работ по созданию «Миров» профессор Михальцев вспоминал:

«Все мои пункты финны, которых я нашёл из-за стали, выполнили. Дело в том, что все аппараты делают из титана, а „Миры“ сделаны из мартенситовой, сильно легированной стали с 18 % никеля. Мне повезло, что я нашёл финскую фирму „Локомо“. В чём ценность этой стали. Титан, лучший сплав, имеет предел текучести — около 70 кг на квадратный миллиметр, а у этой стали — 150. Это была находка»

— Интервью И. Е. Михальцева «Новой Газете»[2]"

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Допустим, я согласен бескорыстно "стучать" о бездомных псах, которые … и за неё мне позволят держать своё электронное производство. Страшно подумать, что делать тем, кому не о чём "стучать" :-)

Готовность стучать это уже уязвимость к атаке из ФСБ.

ФСБ это коррумпированная организация, захватившая и насильно удерживающая власть в Москве. Атаки её агентуры происходят просто, чтобы сохранить доход какого-нибудь коррупционера или из сиюминутных политических интересов. Хорошо продуманная и испытанная защита от ФСБ является важной основой любого надёжного дела. Даже в России.

Собственно, агентуры у Лубянки много. Но производство «Электроники» удалось организовать только под идеологическим патронажем стукача Евгения Фёдорова. Даже это — выдающееся достижение для путинской РФ, т.к. выдаваемые за «патриотические» интересы ведомства меняются. А для того, чтобы сделать успешную высокотехнологичную национальную линию преемственности на многие десятилетия, например 4004-8008-8080-8086-80386-Пентиум–… нужно что-то более надёжное, чем личные интересы высокопоставленных мотыльков вроде Фёдорова или Путина.

Русские ракеты падают из-за этого же. Невозможно одновременно учитывать объективные требования космонавтики и удовлетворять постоянно растущие коррупционные аппетиты ВИП-негодяев.

Питание от батареи: 31 мин 40 сек; от USB: 12 мин 35 сек. Подробнее тут.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Втрое быстрее МК-161 при работе от аккумулятора и в семь раз быстрее при работе от USB? Я ожидал более впечатляющих результатов!

Соотношение быстродействия к частоте процессора у DM42 вдвое ниже, см. тест пустого цикла.

В DM42 стоит 32-битный STM32L476, который выполняет одну команду за такт, а в МК-161 стоит 8-битный W77LE516P, выполняющий команду за четыре такта, всё равно DM42 по идее должен в полтора-два раза быстрее считать :) даже без учёта сопроцессора и со скидкой на компилятор.

Начал искать даташит на W77LE516P, поиск стал ссылки на МК-161 выдавать.

есть всякие SIMD расширения и аппаратное деление, + конвейер, которого в убогом W77LE516P быть не может.

Внутри DM42 это? Откуда дровишки?

digitalinvitro wrote: Внутри DM42 это? Откуда дровишки?

Да: https://pmk.arbinada.com/ru/node/1317

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/