![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Читая книгу Джосьютиса "C++. Стандартная библиотека" русское издание от 2004 года столкнулся с мыслью от автора на стр.136 где он приводит преимущества использования объектов функций.
Мысль такая: "Шаблоны обычно лучше оптимизируются чем функции, поскольку на стадии компиляции доступно больше информации". На мой взгляд обычная ф-ция доступна в том же объеме компилятору насколько доступен объект функции. Вопросы: Почему автор так утверждает? Это действительно так? |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Кажется нашел здесь такое пояснение:
Но насколько это отражает реальное положение дел? |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Функцию можно определить как inline, тогда компилятор тоже постарается её встроить.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
volatile,
Даже если поставить перед обычными функциями слово inline ? Добавлено через 21 секунду W4FhLF, Опередил ))) |
|||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Давненько это уже было... щас я покапался в своих архивах. Нашел таки. вот небольшой отрывок тех старых результатов
Римские цифры, это просто прогоны. us - микросекунды. остальное понятно. Конкретные цифры, как вы понимаете не важны, но общая тенденция - довольно наглядна
прочтите последнюю строчку. я ничего щас не менял. (да собственно какой мне интерес что-то менять?) Добавлено через 2 минуты и 29 секунд Да, возможно вы спросите почему инлайн ничего не меняет. Там компилировалось с макс. оптимизацией на скорость, в том числе: /Ob2 (inline = any suitable) Все результаты в общем и так инлайн. |
||||
|
|||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
volatile, ну так выложи и тестовый код для полной картины
Это сообщение отредактировал(а) Alca - 16.12.2012, 09:09 |
|||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Вот, например одна из тестовых функций:
Здесь используется еще секундомер. (вот старая версия, использовавшаяся с этим кодом) stopwatch.h
так, что еще? myrnd - генератор случайных чисел, используйте любой, решающего значения не имеет. У меня такое ошущение, что я результаты здесь уже публиковал. (щас поищу) Добавлено через 3 минуты и 15 секунд да, результаты здесь уже постил |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Я думал здесь должен быть inline? /Ob2 ещё не даёт гарантии, что она инлайн. Плюс надо добавить const по аналогии с funcktor, т.к. это влияет на оптимизацию. Объективно, разницы между таким элементарным функтором и функцией быть недолжно. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
инт передается по значению, зачем конст? Добавлено через 1 минуту и 28 секунд и там тоже по значению. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Кой-чего интересного нашел на rsdn.ru : Производительность компиляторов С++
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Я так думаю, надо смотреть ассемблерный код, чтобы понять, за счёт чего возникает такая разница... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
мне видится это разница так:
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
mes, интересно... а что будет если туда написать lambda function?
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Даже с:
http://liveworkspace.org/code/1M9JFU$0 |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Вообще-то, то что вызовы разные, у меня и не вызывало никогда сомнений.
Да хотя бы потому что Функтор - это _thiscall, Функция - это _cdecl Можно конечно смотреть асемблерный код, и выщитывать такты. Но это уже чисто академический интерес. А в то время для меня вопрос звучал примерно так: Вызов функции и функтора - безусловно разные вызовы, и нужно выяснить какой из них быстрее, чтобы использовать на приктике ответ на это вопрос я получил (чем кстати и поделился). |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
только вот фокус в том, что используя в функторе ту самую функцию, выполняться сортировка будет быстрей, нежели с переданной функцией Добавлено через 7 минут и 35 секунд лямбда по идеи более легка к оптимизации, и без захвата, представляет собой наипростейший вариант, без проблем конвертируемый в обычную функцию.. Добавлено через 9 минут и 10 секунд
сорри, я подумал, что все ж также интересно в чем лежит эта разница, чтоб можно было не бездумно, а аргументировано применять на приктике Это сообщение отредактировал(а) mes - 17.12.2012, 18:58 |
||||
|
|||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Надо разобрать асм код, делов то
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ждём пока на LWS появится такая возможность. boostcoder обещал
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
mes, , это называется инкапсуляция. всмысле, не забивать голову всякой ерундой. (пусть над этим думают разработчики компиляторов. это их приватная часть.) Да, в конце концов, там не такая уж принципиальная разница. Так ли уж важны эти проценты? |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
В действительности, общее объяснение и понимание более ценны, нежели частные субъективные тесты. Обычно, конечно, всё начинается с тестов, но то, что докопались до сути -- хорошо.
Это сообщение отредактировал(а) W4FhLF - 17.12.2012, 23:54 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не забивать ее можно по разному.. можно проведя тесты придти к выводу, что функция - зло, и везде использовать функторы. а можно разобраться, что дело не в функции, а в способе е передачи, и спокойно, не забивая голову тестами и предрасудками, использовать и тех и других подходящим образом.. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
mes, отличная идея. Когда меня спросили по поводу этой разницы я сразу отверг её, т.к. забыл о разнице в передаче. Поэтому слова Джосьюттиса и Майерса являются верными для своего времени. Но это не совсем верно для современности, где компиляторы могут встроить подобную конструкцию. Никто не мешает встроить алгоритм STL после чего пропадет всякое взятие адреса и функция может быть встроена.
Поэтому получается, что в общем случае функторы могут быть быстрее, но это далеко не обязательно. Использование шаблонных функций вполне может быть встроено, так же как и функтор. Не знаю, может быть это влияние перевода, но, по факту, в издании 2012 года он менее категоричен:
Это сообщение отредактировал(а) vinter - 19.12.2012, 14:12 |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Справедливости ради стоит привести и слова Джосьютиса из русского издания:
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |