Нужна ли функция?
У меня в программе часто повторяется такой код:
ADOQuery->SQL->Clear();
ADOQuery->SQL->Add("что то");
Я все это дело заменил функцией вида
q->Close();
q->SQL->Clear();
q->SQL->Add(s);
return;
где-то в начале исходника болтается прототип этой функции
Вопрос в слдующем. В каком из вышеприведенных примеров будет работать быстрее?
У меня в программе часто повторяется такой код:
ADOQuery->SQL->Clear();
ADOQuery->SQL->Add("что то");
Я все это дело заменил функцией вида
q->Close();
q->SQL->Clear();
q->SQL->Add(s);
return;
где-то в начале исходника болтается прототип этой функции
Вопрос в слдующем. В каком из вышеприведенных примеров будет работать быстрее?
Расходы на вызов функции минимальны - но они есть. Поэтому быстрее будет работать без функции. Это естественно. Другое дело, что прирост производительности может на общем фоне быть просто не заметен. Вариант - можно попытаться возложить задачу оптимизации на компилятор используя __fastcall. В таком случае (если это возможно) компилятор преобразует вызов функции в inline и попытается организовать передачу параметров через стек. Что бы это произошло, функция должна соответствовать определенным требованиям (см. описание inline-функций).
да-ну-нах:)
1. __fastcall и inline никак не связаны (т.е. модификатор __fastcall не заставляет ф-ю быть встроенной)
2. Параметры всегда (почти) передаются через стек, только порядок этот может быть разный
3. __fastcall предписывает передать первые два параметра через регистры процессора, в этом и есть ускорение
_fastcall f(A, B, C, D);
_fastcall:
push D
push C
mov edx, B
mov eax, A
call F
; ret 8 ; очистка стека - в функции. т.е. переменное число параметров не допускается (на счет последнего не уверен)
Вопрос в слдующем. В каком из вышеприведенных примеров будет работать быстрее?
Затраты на вызов функции в данном контексте могут вообще не учитываться... Пишите, как удобно! Я бы предпочел вариант с функцией, т.к. меньше дублирования кода.
В крайнем случае действительно можно поставить __inline, но на мой взгляд это ничего не изменит. Скажу прописную истину, но тем не менее: "оптимизировать надо то, что медленно работает". И кроме как профайлером такие места не найти.
3. __fastcall предписывает передать первые два параметра через регистры процессора, в этом и есть ускорение
три: eax, edx, ecx
1. __fastcall и inline никак не связаны (т.е. модификатор __fastcall не заставляет ф-ю быть встроенной)
может перепутал с чем либо - но вроде как в руководстве утверждалось, что если функция может быть преобразована к инлайн - то это делается. Ну может и спутал чего - хз. Смотреть некогда. Не делает - ну и хрен с ней.