процедура быстрее функции.. почему?

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Сообщение Mirage » 04.06.2006 22:10:01

SovNarKom: Что значит не будут? const дает возможность оптимизировать компилятору доступ к переменной, но нельзя ее изменять. Нетрудно догадаться что это за оптимизация. Это обращение к данной переменной как к переменной с var модификатором. Т.е. по ссылке.
Куда будут указывать обе ссылки в этом вызове?
Transform4Vector4s(V, M, V);
На V.
Только что проверил - так и есть. Delphi 7. Как с оптимизациями, так и без.
А ты проверял прежде чем безапелляционно заявить "не будут"?

Что касается модификатора - компилятор и сам может определить есть обращение к переменной на запись, или нет и оптимизировать в зависимости от. Причем выдавать warning в случае наличия var-параметра вкупе с оптимизированной переменной не мешало бы...
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение SovNarKom » 04.06.2006 23:28:57

Mirage
Transform4Vector4s(V, M, V);
Бредовый пример, конечно на одну переменную)))
Причём тут оптимизация, тут логика, по поводу const - всё там нормально. так и надо
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение stopkin » 06.06.2006 00:58:27

В Delphi почему-то был принят вариант без копирования результата, и там что function, что procedure - оба варианта были идентичны (что очень радовало). А про вызовы (V,M,V) просто запомнить, что так делать не надо, и никаких трудностей тут нет. (V,M,V2)
stopkin
незнакомец
 
Сообщения: 4
Зарегистрирован: 06.06.2006 00:42:57

Сообщение Mirage » 06.06.2006 07:08:26

stopkin: Почему идентичны? В Delphi процедура тоже быстрее функции.
А что касается примера - ну иногда надо просто модифицировать вектор, не заводя дополнительных. Никто не говорит что это надо использовать направо и налево. Просто есть такой камешек.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение stopkin » 06.06.2006 08:43:23

Delphi 6, если функция возвращает record или object, то вызов такой функции выглядит как вызов процедуры с var параметром, в который передали результирующую переменную. А во FreePascal в стеке отводится промежуточная переменная, передается как var, а потом побайтное копирование результата.
stopkin
незнакомец
 
Сообщения: 4
Зарегистрирован: 06.06.2006 00:42:57

Сообщение Mirage » 06.06.2006 11:51:35

stopkin: Не совсем так. В простейших случаях, например в случае функции, возвращающей новый вектор по трем числам, действительно Result располагается на месте переменной, которой его присваивают.
Но в случае более сложной функции, например описанной мной Transform4Vector4s, Result создается уже на стеке, затем перемещается четырьмя movsd.
И это правильно, иначе тот подводный камень имел место бы и здесь, а в случае функции это недопустимо. Ведь передавая в процедуру один и тот же параметр мы понимаем, что он может измениться, а при присваивании значения функции он до выхода из функции измениться ну никак не должен.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение stopkin » 06.06.2006 16:32:59

Mirage
А в чем тогда "сложность" заключается? Вроде и там, и там - record, но при Transform4Vector4s result - это временная переменная, а в simd_vecs3_sub_1 - нет? Почему компилятор Delphi по-разному делает с одними и теми же типами?
stopkin
незнакомец
 
Сообщения: 4
Зарегистрирован: 06.06.2006 00:42:57

Сообщение stopkin » 06.06.2006 16:53:54

Есть подозрение, что компилятор Delphi одну и ту же функцию может вызвать из разных местах по разному: может с промежуточной результирующей переменной, а может и напрямую.
stopkin
незнакомец
 
Сообщения: 4
Зарегистрирован: 06.06.2006 00:42:57

Сообщение Mirage » 06.06.2006 18:41:47

В Transform4Vector4s НЕЛЬЗЯ без временной переменной, ибо аргумент может модифицироваться, если он совпадёт с результатом.
Кстати, повторить вчерашний опыт сейчас не смог. В смысле заставить возвращать не через стек. Любой вектор через стек гад возвращает...
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение vada » 06.07.2006 14:49:27

Sniper писал(а):Вот они родимые:


Если с производительностью поджимает, или эти процедуры/функции в большом цикле используются, то есть прямой смысл INLINE делать. Сразу экономим на длинных CALL / RET
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Пред.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru
cron