|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.10.2015, 11:31 | #1 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Помогите с оптимизацией
Delphi XE8, x64
В программе используются 256-битные переменные, логически представляющие из себя квадрат 16x16 бит. У такого квадрата существует 7 симметричных состояний (включая исходное 8). Симметричные состояния можно получить:
TBGWState - какой-нибудь тип размером в 256 бит (32 байта) PBGWState - указатель на переменную этого типа Есть процедура, которая преобразует квадрат всеми возможными способами и помещает результат в массив Код:
Последний раз редактировалось alcaedo; 17.10.2015 в 12:31. |
17.10.2015, 11:34 | #2 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Есть функция, которая возвращает 8 бит информации о том, какими симметриями обладает заданное состояние (заданный квадрат, заданная переменная). Нулевой бит результата всегда установлен и соответствует тому, что исходное состояние без преобразований равно самому себе.
Код:
|
17.10.2015, 11:36 | #3 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Код:
|
17.10.2015, 11:36 | #4 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Нужна функция, которая будет возвращать не все 8 состояний, а только заданные. Можно конечно тупо взять функцию _GetSimmetryAllAsm и в конце удалить из массива ненужные состояния. При этом придётся либо делать ещё временный массив, либо как-то смещать состояния в массиве во время удаления лишних. Это всё добавит кучу времени на выполнение, а участок кода, где это будет использоваться ко времени критичен. Подскажите, как оптимизировать?
Вот, заготовка: Код:
|
17.10.2015, 11:48 | #5 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Можно полюбопытствовать почему именно на ассемблере вставками нужно решать сию задачу?
I'm learning to live...
|
17.10.2015, 12:29 | #6 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Это самый быстрый из известных мне способов.
_GetSimmetryAllAsm написана просто так, в программе не планируется её использовать. Ну, разве что для отладки. _GetSimmetryTypeAsm используется в программе несколько (мало) раз. Выполняется на 23-30% быстрее обычного Deplhi на типе "set of byte". Написана просто так. _GetSimmetryListAsm очень нужная и важная функция. Должна будет использоваться постоянно. Ну, там миллионы раз в секунду, или как железо позволит. Если не придумается способ оптимизации, то, наверное, придётся клепать ещё 255 вариантов _GetSimmetryAllAsm0..._GetSimmetryA llAsm254 и заводить переменную-указатель на какой-то из этих вариантов. Тип симметрии меняется в программе редко. С его изменением будет меняться переменная-указатель-на-вариант-функции. Последний раз редактировалось alcaedo; 17.10.2015 в 12:59. |
17.10.2015, 12:47 | #7 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Код:
I'm learning to live...
|
|
17.10.2015, 13:05 | #8 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Я там успел подредактировать....
Не думаю, что достаточно, мне каждый такт дорог. Вариант функции, которая определяет тип симметрии, на чистом Delphi выглядел так. То, что эта функция проделывает на 10 секунд, ASM-вариант делает за 7. Код:
Последний раз редактировалось Stilet; 17.10.2015 в 14:04. |
17.10.2015, 14:05 | #9 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Я только идею подал. Цитата:
I'm learning to live...
|
||
17.10.2015, 14:12 | #10 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
десять секунд для определения в каком из десяти состояний находится система, говрят о том, что нужна не оптимизация, а хорошее решение.
а 256 бит обязательно использовать? или можно систему описать 256-ю байтами? char box[256], symmetry_val; для максимальной скорости, я думаю, при использовании байтов, можно задать статические таблицы преобразования для каждого типа симметрии. char main_diagonal_map[256], side_diagonal_map[256], corner_flip[256] ... symmetry_val = 0; for (unsigned int i(0);i<256;i++) symmetry_val |= (box[i] ^ box[main_diagonal_map[i]]); success = (symmetry_val == 0); |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите с оптимизацией!!!((( | X@NDER | Фриланс | 2 | 30.10.2013 21:28 |
Проблема с оптимизацией | julia9311 | Microsoft Office Excel | 3 | 31.05.2013 02:36 |
Проблема с оптимизацией скрипта | Andrey[SF] | PHP | 1 | 19.05.2009 19:20 |
Нужна помощь с оптимизацией | t3ns0r | Общие вопросы C/C++ | 1 | 07.03.2009 14:58 |