Q-Master, спасибо за столь ценные советы. Никогда до этого не приходилось сталкивался с memoryview! Есть отличный повод разобраться и применить. Авось эмулятор начнёт шевелиться чуть шустрее![]()
Q-Master, спасибо за столь ценные советы. Никогда до этого не приходилось сталкивался с memoryview! Есть отличный повод разобраться и применить. Авось эмулятор начнёт шевелиться чуть шустрее![]()
С уважением, Станислав.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
CityAceE, скриншоты просто прослезили ) Создал тему эмулятора на игровом форуме, замечательный предпраздничный релиз!
https://www.old-games.ru/forum/posts/1521263/
Мне вот что подумалось, сколько в IT отрасли ещё специалистов - у которых первой машиной была отечественная микроЭВМ? Может опрос какой-то организовать? Естественно все клоны спектрумов (и т.п.) нашего производства идут в зачёт как отечественные (что естественно!)
Последний раз редактировалось hobot; 27.12.2018 в 03:50.
А какие это может дать преимущества? Как я себе это понимаю, когда каждый флаг в отдельной переменной, его можно быстрее устанавливать/сбрасывать. Всего пара команд i8080 требует полного флагового регистра, и для этих команд не сильного дорого запаковать все флаги в один байт и производить обратную процедуру. А все остальные команды расставляют флаги по отдельности.
Это, конечно, не сильно скажется на производительности, но, да, отказаться можно.
С уважением, Станислав.
Я не знаю, питона, поэтому пример приведу на Си:
Вот, например, твой вариант RLCA:
И как можно оптимально это эмулировать (без учета универсальности Z80/8080):Код:reg_a = reg_a << 1 flag_c = bool(reg_a & 0x100) reg_a = (reg_a | flag_c) & 0xff if not i8080: flag_h = False fflag_n(False) fflag_3(bool(reg_a & 0b00001000)) fflag_5(bool(reg_a & 0b00100000))
Код:reg_A = (reg_A << 1) | (reg_A >> 7); reg_F = (reg_A & CONST_53C) | (reg_F & CONST_SZPH);
Приведённый тобой пример будет работать в Python без каких-либо изменений, даже точки с запятой убирать не придётсяСпасибо, я поизучаю и такой вариант, попробую померить скорость и если будет выигрыш, то применю.
Тоже нужно будет прикинуть и измерить скорость обоих вариантов. Хотя в Python я ещё ни разу не использовал вызов функции по значению из списка - пользовался только вызовом по словарю, как в этом эмуляторе. И даже не знаю осуществимо ли это? Видимо, осуществимо.
Я уже получил довольно много полезных советов, обязательно воспользуюсь ими всеми. Мне бы сейчас заставить работать систему при варианте хранения регистров в memoryview. Мало того, что оно просто сейчас перестало работать, так ещё и всякие нюансы всплыли. Например, вариант, предложенный Titus'ом:
при таком методе хранения работать не будет, например, если reg_A == 0xFF. Как только сдвинутся биты внутри первых скобок я получу ошибку, что это значение не может хранится в байте. Вот и приходится огород городить из временных переменных, что явно не идёт на руку скорости эмуляции.Код:reg_A = (reg_A << 1) | (reg_A >> 7);
Последний раз редактировалось CityAceE; 27.12.2018 в 15:46.
С уважением, Станислав.
Конечно осуществимо. И из списка и из тупли.
Написал незамысловатый бенчмарк. С современными компами и интерпретируемыми языками уровня питона такие бенчмарки мало толку дают. У меня получается разброс в 10% между запусками, слишком много внешних воздействий. В среднем, как мне показалось, тупля незначительно опережает список, список незначительно опережает словарь, но в общем это ловля блох и вряд ли эмулятор ускорится в два раза от такой переделки. Хотя в реальном коде разница может оказаться другой и, учитывая то, что попробовать вообще ничего не стоит, по-моему стоит попробовать
- - - Добавлено - - -Код:import time def foo(): return 'foo' def bar(): return 'bar' disp=[foo if i & 1 else bar for i in range(256)] dict={} for i in range(256): dict[i] = foo if i & 1 else bar niter = 100000000 print("dispatch using list") start_time = time.time() for i in range(niter): u = disp[i & 255]() elapsed_time = time.time() - start_time print("elapsed time=", elapsed_time) print("dispatch using dictionary") start_time = time.time() for i in range(niter): u = dict[i & 255]() elapsed_time = time.time() - start_time print("elapsed time=", elapsed_time) tust=tuple(disp) print("dispatch using tuple") start_time = time.time() for i in range(niter): u = tust[i & 255]() elapsed_time = time.time() - start_time print("elapsed time=", elapsed_time)
P.S. заметил, что вставил версию без вызова функции, только с выборкой. Перепроверил, разницы нет, но на всякий случай -- в замеряемых циклах добавить ().
Больше игр нет
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)