|
|
| Посл.отвђт | Сообщен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; памяти жрет больше, зато выполняется быстрее. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.096 |