Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нужна ли функция?

33K
12 августа 2009 года
Posix86749
54 / / 13.07.2009
Вопрос возможно не в тему но все же.
У меня в программе часто повторяется такой код:
 
Код:
ADOQuery->Close();
ADOQuery->SQL->Clear();
ADOQuery->SQL->Add("что то");

Я все это дело заменил функцией вида
 
Код:
void func(ADOQuery *q,String s)
q->Close();
q->SQL->Clear();
q->SQL->Add(s);
return;

где-то в начале исходника болтается прототип этой функции
 
Код:
void func(ADOQuery *, String);

Вопрос в слдующем. В каком из вышеприведенных примеров будет работать быстрее?
288
12 августа 2009 года
nikitozz
1.2K / / 09.03.2007
Не думаю, что вы почувствуете разницу в производительности. Расходы на вызов функции минимальны (если еще заменить String s на const String &s).
1
12 августа 2009 года
kot_
7.3K / / 20.01.2000
Цитата: Posix86749
Вопрос возможно не в тему но все же.
У меня в программе часто повторяется такой код:
 
Код:
ADOQuery->Close();
ADOQuery->SQL->Clear();
ADOQuery->SQL->Add("что то");

Я все это дело заменил функцией вида
 
Код:
void func(ADOQuery *q,String s)
q->Close();
q->SQL->Clear();
q->SQL->Add(s);
return;

где-то в начале исходника болтается прототип этой функции
 
Код:
void func(ADOQuery *, String);

Вопрос в слдующем. В каком из вышеприведенных примеров будет работать быстрее?


Расходы на вызов функции минимальны - но они есть. Поэтому быстрее будет работать без функции. Это естественно. Другое дело, что прирост производительности может на общем фоне быть просто не заметен. Вариант - можно попытаться возложить задачу оптимизации на компилятор используя __fastcall. В таком случае (если это возможно) компилятор преобразует вызов функции в inline и попытается организовать передачу параметров через стек. Что бы это произошло, функция должна соответствовать определенным требованиям (см. описание inline-функций).

246
12 августа 2009 года
GIZMO
1.8K / / 30.07.2004
Цитата: kot_
Вариант - можно попытаться возложить задачу оптимизации на компилятор используя __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 ; очистка стека - в функции. т.е. переменное число параметров не допускается (на счет последнего не уверен)

1.9K
12 августа 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Posix86749

Вопрос в слдующем. В каком из вышеприведенных примеров будет работать быстрее?


Затраты на вызов функции в данном контексте могут вообще не учитываться... Пишите, как удобно! Я бы предпочел вариант с функцией, т.к. меньше дублирования кода.
В крайнем случае действительно можно поставить __inline, но на мой взгляд это ничего не изменит. Скажу прописную истину, но тем не менее: "оптимизировать надо то, что медленно работает". И кроме как профайлером такие места не найти.

14
12 августа 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: GIZMO

3. __fastcall предписывает передать первые два параметра через регистры процессора, в этом и есть ускорение


три: eax, edx, ecx

1
12 августа 2009 года
kot_
7.3K / / 20.01.2000
Цитата: GIZMO
да-ну-нах:)

1. __fastcall и inline никак не связаны (т.е. модификатор __fastcall не заставляет ф-ю быть встроенной)


может перепутал с чем либо - но вроде как в руководстве утверждалось, что если функция может быть преобразована к инлайн - то это делается. Ну может и спутал чего - хз. Смотреть некогда. Не делает - ну и хрен с ней.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог