Pull to refresh

Comments 37

UFO landed and left these words here
Это действительно супер-пупер-мега круто. Я думал меня сложно чем-то удивить на баше. Приятно узнать, что я ошибался :) А за советы по оптимизации отдельное спасибо
После мультиплеера на .bat меня уже даже линукс на JS не удивляет -_-
Когда я был мелкий, у нас сосед из крышечек из под бутылок с тархуном сделал голую бабу. Я рад, что нашлись продолжатели этого великого дела!
UFO landed and left these words here
Модель бабы получилась действующая в натуральную величину?
Достаньте руки из под стола! :-)
Не нашел, что же будет с эмулятором, если PC станет больше 65535.
Тоже самое касается и SP, только с учетом того, что он вниз растет.
UFO landed and left these words here
Нет. Это будет провалом теста на здравый смысл %)
«На разработку эмулятора ушло около 8 часов»
После этой фразы я переосмыслил свою скорость разработки…
На самом деле задача решена слишком прямолинейно. В ней 80% копи-пасты с мелкими правками. Поэтому ничего удивительного в скорости решения нет.
Код программы, на самом деле можно сократить раза в 3-4. Не знаю, правда как оно скажется на скорости работы.
В чем возможность
Если расположить систему комманд i8080 в виде таблицы 16*16, то сразу станет видна битовая структура комманд. Старшие биты кода операции отвечают за производимое действие, младшие — за регистры, над которыми надо надругаться произвести операции.
Гораздо лучше — в виде куба. Там регистры по три бита занимают, а упоминаются в куче команд. В том числе именно поэтому в те времена восьмеричная система была такой популярной.
На самом деле, я в курсе, что можно сократить код в 3-4 раза. Что можно сделать его более компактным. Что можно представить MOV R,R как 01DDDSSS. Но это привело бы к значительному снижению производительности. Во-первых, нужно было бы добавить перевод байта в набор бит. Во-вторых, нужно было бы добавить дополнительные условия для определения кода функции, DDD и SSS. Не принимая во внимание затраты на перевод байта в набор бит, я сравнивал производительность двух if (а их меньше двух никак не выйдет) в цикле против одного case.

#!/bin/bash
func1 () {
:
}

func2 () {
:
}

a=1
b=0
for (( i=0 ; i<100000 ; i++ )) do
if (( a == 1 )) 
then
if (( b == 1 ))
then
func1
fi
else 
func2
fi
done

real 0m1.203s
user 0m1.202s
sys 0m0.030s

#!/bin/bash
a=1
for (( i=0 ; i<100000 ; i++ )) do
case "$a" in
1) ;;
*) ;;
esac
done

real 0m0.890s
user 0m0.890s
sys 0m0.030s

Иногда примитивные варианты производительнее.
И, да, ваш вариант реализовать можно еще быстрее, чем мой. Я проверял.
А зачем переводить в биты? Делаем «логическое и» и отсекаем все лишнее.

Тест скорости работы, как мне кажется немного не корректно построен. В первом случае текст программы длинней. Интерпретатору больше приходится по файлу программы бегать :). Это же не компилятор. Не знаю как баш, а виндусовый интепретатор читает и выполняет код построчно.

Используя битовые маски можно существенно сократить количество пунктов в «case». Обрабатывая группы команд (арифметические, логические, пресылок и т.д.). И как это скажется на производительности может показать только эксперимент.
Я делал разные тесты, и case все равно был быстрее, чем пара if-ов.
Без if я вижу только один вариант: в качестве регистров использовать массив, в случае с MOV получить номера в массиве регистра-приемника и регистра-источника — (( ( OPCODE & 2#00111000 ) >> 8 )) и (( OPCODE & 2#00000111 )), а затем обращаться к элементам этого массива по номерам. Но так будет гораздо медленнее, чем с case или if — этот случай я тоже проверял. Массивы работают заметно медленнее, чем просто переменные — чуть ли не в 5 раз. По крайней мере, на моей машине.
> Вызов expr или bc в цикле может замедлить вашу программу в несколько раз.
Неудивительно, если вы используете в первом случае 100к итераций а во втором 10к :)
Исправил. Спасибо. Все равно — гораздо быстрее работает без expr.
Универсальный комментарий в этом блоге.
Ах, ализар, ализар… Или это не отсюда?
Пора уже этот коммент автоматически вставлять после каждой публикации в «Ненормальном программировании». Ну просто чтобы руками не набивать всякий раз :)
А еще «маразм крепчал» в блоге «Интеллектуальная собственность» и что-нибудь про Erlang в «Node.js».
Пора уже заводить отдельный блог — Извращения на Bash
После того, как я написал первые 7 программ под этот процессор, меня пытались разбудить ночью и я в беспамятстве бормотал про запись в регистры…
Если вы хотите, чтобы ваш скрипт на bash выполнялся как можно быстрее

… то перепишите его так, чтобы он запускался и работал под обычным sh?
В случае с эмулятором нужно править арифметику и реализовывать массивы самостоятельно, например, вот таким способом. После этого заработать должно в sh, а может и в ash.
Нет, вы перепутали, эта картинка — для блога DIY :)
Sign up to leave a comment.

Articles