Здравствуйте, пффф, Вы писали:
П>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?
Здравствуйте, ArtDenis, Вы писали:
AD>Очевидно что бенчмарк ответит на твой вопрос
написать хороший бенчмарк порой сложнее, чем полноценный код.
В одном случае, всё по значению, но много.
В другом, по ссылке, мало, но дополнительные расходы на подгрузку данных по адресу. А там куча факторов, которые никакой бенчмарк не осилит. Если вы просто в цикле запустите функцию, то процессор закеширует данные и по ссылке будет явно лучше. И это будет ответ в стиле AI: уверенно и неверно. А в реальной программе функция вызывается неравномерно и может быть куча cache miss.
Re[3]: Дорого ли нынче гонять структуры по значению?
Здравствуйте, sergii.p, Вы писали:
SP>написать хороший бенчмарк порой сложнее, чем полноценный код. SP>В одном случае, всё по значению, но много. SP>В другом, по ссылке, мало, но дополнительные расходы на подгрузку данных по адресу. А там куча факторов, которые никакой бенчмарк не осилит. Если вы просто в цикле запустите функцию, то процессор закеширует данные и по ссылке будет явно лучше. И это будет ответ в стиле AI: уверенно и неверно. А в реальной программе функция вызывается неравномерно и может быть куча cache miss.
Вот-вот, я потому и спрашивал, мало ли у кого есть такой опыт
Здравствуйте, пффф, Вы писали:
П>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?
Смотря что ты с ней делаешь потом.
Маленькие структуры возвращаются через регистры. Для возврата больших структур caller передает невидимый параметр, указатель на память, куда структуру отгружать. Т.е., это примерно как если явно передавать на нее указатель.
Но важно еще и то, как ты в конечном итоге с ней работаешь. Если это структура не стеке, это одно, а если для нее где-то аллоцируется а потом освобождается память, это совсем другое.
Re[2]: Дорого ли нынче гонять структуры по значению?
Здравствуйте, Pzz, Вы писали:
П>>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?
Pzz>Смотря что ты с ней делаешь потом.
Pzz>Маленькие структуры возвращаются через регистры.
Я не возвращаю (может где и возвращаю, точно не скажу, но на порядок меньше, чем просто передаю, и передаю обычно пару или больше), только передаю параметром в функции.
Pzz>Для возврата больших структур caller передает невидимый параметр, указатель на память, куда структуру отгружать. Т.е., это примерно как если явно передавать на нее указатель.
Хм, а разве возврат структур, да и остального, не через стек идёт?
Pzz>Но важно еще и то, как ты в конечном итоге с ней работаешь. Если это структура не стеке, это одно, а если для нее где-то аллоцируется а потом освобождается память, это совсем другое.
Структура всегда только на стеке, и там только POD-типы в членах.
Re[3]: Дорого ли нынче гонять структуры по значению?
Здравствуйте, sergii.p, Вы писали:
SP>написать хороший бенчмарк порой сложнее, чем полноценный код.
Для грубой оценки этого более чем достаточно. Главное при написании бенчмарка понимать как обойти такие оптимизации компилятора как инлайнинг функций, разворачивания циклов и другие прочие, которые сделают результат бенчмарка бессмысленным )
Но согласен, с реальным кодом может быть большая разница.
Здравствуйте, ArtDenis, Вы писали:
SP>>написать хороший бенчмарк порой сложнее, чем полноценный код.
AD>Для грубой оценки этого более чем достаточно. Главное при написании бенчмарка понимать как обойти такие оптимизации компилятора как инлайнинг функций, разворачивания циклов и другие прочие, которые сделают результат бенчмарка бессмысленным )
А я не хочу обходить инлайнинг, у меня весь код в хидерах, если компилятор считает, что надо инлайнить — пусть инлайнит
AD>Но согласен, с реальным кодом может быть большая разница.
Ну вот я и спрашивал, может у кого-то есть реальный опыт
Re[3]: Дорого ли нынче гонять структуры по значению?
Здравствуйте, пффф, Вы писали:
П>Хм, а разве возврат структур, да и остального, не через стек идёт?
Зависит от ABI. На x86-64 место для возврата структуры выделяет на своем стеке caller, а вызываемая процедура получает на него указатель.
Что до остального, в целом, если объем возвращаемого невелик, стараются использовать не стек, а регистры.
Pzz>>Но важно еще и то, как ты в конечном итоге с ней работаешь. Если это структура не стеке, это одно, а если для нее где-то аллоцируется а потом освобождается память, это совсем другое.
П>Структура всегда только на стеке, и там только POD-типы в членах.
Тогда, наверное, не дорого. В не слишком критичном по скорости месте (я таких мест в любой программе большинство) я бы исходил из удобства программирования. Ну а если скорость поджимает, надо делать бенчмарку, однако.
Re[5]: Дорого ли нынче гонять структуры по значению?
Здравствуйте, пффф, Вы писали:
П>Ну вот я и спрашивал, может у кого-то есть реальный опыт
Что значит реальный опыт? Когда меня не устраивает производительность, я профилирую и ускоряю узкие места (а то и архитектуру меняю), а не гадаю над придуманной проблемой
Здравствуйте, пффф, Вы писали:
П>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?
Чем структура больше указателя, тем дороже будет передача по значению, например:
time на моей машине для vec4d_plus_val составляет в среднем 600, а vec4d_plus_ref в среднем 440, т.е. разница стабильно около 35%.
(компилятор из состава MS VC++ 2008, откомпилировано в release (/o2))
Если не запрещать inline-инг, то разницы не будет, в обоих вариантах time в среднем = 140.
Другое дело контекст использования, если эта функция не частовызываемая числодробилка-битовыжималка, то на таком размере структуры разницы можно и не заметить (особенно если эта функция обращается например к I/O).
Re[2]: Дорого ли нынче гонять структуры по значению?