· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Чуть-чуть оптимизации

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 8, 2004 00:26:24

Я тут налабал простейший макрос на сях. Может, кто чего скажет:
#if defined WIN32
	#define OPTIMIZED_CALL __inline static
#elif
	#define OPTIMIZED_CALL __inline__ static
#endif

#if defined WIN32
	#define ALIGNED_STRUCT(x) _declspec(align(x))
#elif
	#define ALIGNED_STRUCT(x) __attribute__ ((aligned (x)))
#endif



Дата: Июн 8, 2004 00:27:28

Использовать предельно просто:
ALIGNED_STRUCT(32) typedef struct _files

OPTIMIZED_CALL Uint4 ELFHash(char *str)


Все линкуется и работает. Может у кого есть добавочные комментарии или пинки?


Дата: Июн 8, 2004 08:25:07

Каким образом ведут себя разные компайлеры? Какой код генерят? В принципе эффект должен быть таким же, как ежели обзывать переменные "register". Под некоторыми помогало, например GCC, на некоторых - забивало. пример - VisualC++6.0
Меня терзают смутные сомнения... :)


Дата: Июн 8, 2004 15:42:29

Я пробовал вот такой код на VC++ 6.0:
_asm mov esi, pstrBuffer
_asm mov edx, iByteCount

align 32
GET_CHAR:
_asm lodsb
_asm ...
_asm dec edx
_asm jnz GET_CHAR

Не компилирует, зараза!
Говорит, что "specified alignment does not match the segment alignment".


Дата: Июн 8, 2004 17:56:42

В принципе эффект должен быть таким же, как ежели обзывать переменные "register".

Ничего подобного. В MSDN явно сказано, что компилятор игнорирует register. Я еще fastcall хотел приписать - так и fastcall игнорирует, зараза.
static облегчает жизнь линкеру, а inline тоже может быть проигнорирован. Хотя, с другой стороны, может быть и не проигнорирован :)


Дата: Июн 9, 2004 12:19:59

То, что register игнорируется под VC - проверено на собственном опыте. О чем я и говорил, собственно. У них там основной уклон идет на спаривание инструкций, насколько я понял. Ну и на 100% доверять MSDN я бы не стал. :) Кстати, у меня на страничке есть ссылки на некоторые способы локальной оптимизации, если у кого есть толковые, можете скинуть. Будем дополнять и обмениваться. :))


Дата: Июн 9, 2004 15:47:44

Я пишу с _fastcall на VC++ 6.0.
Всё работает OK - в дизасме видно...


Дата: Июн 10, 2004 02:59:38

кстати, по MSDN. бородатый прикол, но мож кто еще не
знает.

смотрим
CWnd::PreCreateWindow

видим:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    // Create a window without min/max buttons or sizable border
    cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;

    // Size the window to 1/3 screen size and center it
    cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
    cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;

    cs.y = ((cs.cy * 3) - cs.cy) / 2;
    cs.x = ((cs.cx * 3) - cs.cx) / 2;
    // Call the base-class version
    return CFrameWnd::PreCreateWindow(cs);
}

...и пытаемся заоптимизить строки, выделенные жирным


Дата: Июн 10, 2004 04:32:25

Офуеть. И зачем?


Дата: Июн 10, 2004 05:41:03

cs.y = ((cs.cy * 3) - cs.cy) / 2;
cs.x = ((cs.cx * 3) - cs.cx) / 2;


Нда...


Дата: Июн 10, 2004 10:44:24

AsmGuru62

"specified alignment does not match the segment alignment"

Дык и в MASM (ленкер) ругается на align > 16. Лечится созданием своей секции с выравниванием page, iirc.


Дата: Июн 10, 2004 12:37:01

> Офуеть. И зачем?
не иначе как для торможения процессора ;)
а еще говорят, что в ms платят (или платили?) за кол-во строк кода, не считая пустые. вот программисты и старались ;)


Дата: Июн 10, 2004 12:50:02 · Поправил: Eduard_x

Предлагаю супернавароченый способ оптимизации данного участка :)))
//cs.y = ((cs.cy * 3) - cs.cy) / 2;
//cs.x = ((cs.cx * 3) - cs.cx) / 2;
поспешил блин... :)
cs.y = cs.cy;// * 3) - cs.cy) / 2;
cs.x = cs.cx;// * 3) - cs.cx) / 2;


Дата: Июн 10, 2004 13:38:14

cs.y = cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
cs.x = cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;


Дата: Июн 10, 2004 16:20:26

но и это еще не предел!
cs.y = ::GetSystemMetrics(SM_CYSCREEN);
cs.y = cs.cy = (cs.y / 2 + cs.y /4) /2;

памяти жрет больше, зато выполняется быстрее.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.096