Дорого ли нынче гонять структуры по значению?
От: пффф  
Дата: 03.08.24 15:32
Оценка:
Привет

Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?
Re: Дорого ли нынче гонять структуры по значению?
От: reversecode google
Дата: 03.08.24 15:41
Оценка: -1
компилер ее может через mmx запихать
в несколько инструкций
если в 8 байт не влезет для одного регистра
Re: Дорого ли нынче гонять структуры по значению?
От: ArtDenis Россия  
Дата: 03.08.24 16:20
Оценка: +2 :)
Здравствуйте, пффф, Вы писали:

П>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?


Очевидно что бенчмарк ответит на твой вопрос
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Дорого ли нынче гонять структуры по значению?
От: sergii.p  
Дата: 07.08.24 11:46
Оценка: +1
Здравствуйте, ArtDenis, Вы писали:

AD>Очевидно что бенчмарк ответит на твой вопрос


написать хороший бенчмарк порой сложнее, чем полноценный код.
В одном случае, всё по значению, но много.
В другом, по ссылке, мало, но дополнительные расходы на подгрузку данных по адресу. А там куча факторов, которые никакой бенчмарк не осилит. Если вы просто в цикле запустите функцию, то процессор закеширует данные и по ссылке будет явно лучше. И это будет ответ в стиле AI: уверенно и неверно. А в реальной программе функция вызывается неравномерно и может быть куча cache miss.
Re[3]: Дорого ли нынче гонять структуры по значению?
От: пффф  
Дата: 07.08.24 11:53
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>написать хороший бенчмарк порой сложнее, чем полноценный код.

SP>В одном случае, всё по значению, но много.
SP>В другом, по ссылке, мало, но дополнительные расходы на подгрузку данных по адресу. А там куча факторов, которые никакой бенчмарк не осилит. Если вы просто в цикле запустите функцию, то процессор закеширует данные и по ссылке будет явно лучше. И это будет ответ в стиле AI: уверенно и неверно. А в реальной программе функция вызывается неравномерно и может быть куча cache miss.

Вот-вот, я потому и спрашивал, мало ли у кого есть такой опыт
Re: Дорого ли нынче гонять структуры по значению?
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.08.24 12:10
Оценка:
Здравствуйте, пффф, Вы писали:

П>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?


Смотря что ты с ней делаешь потом.

Маленькие структуры возвращаются через регистры. Для возврата больших структур caller передает невидимый параметр, указатель на память, куда структуру отгружать. Т.е., это примерно как если явно передавать на нее указатель.

Но важно еще и то, как ты в конечном итоге с ней работаешь. Если это структура не стеке, это одно, а если для нее где-то аллоцируется а потом освобождается память, это совсем другое.
Re[2]: Дорого ли нынче гонять структуры по значению?
От: пффф  
Дата: 07.08.24 12:25
Оценка:
Здравствуйте, Pzz, Вы писали:

П>>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?


Pzz>Смотря что ты с ней делаешь потом.


Pzz>Маленькие структуры возвращаются через регистры.


Я не возвращаю (может где и возвращаю, точно не скажу, но на порядок меньше, чем просто передаю, и передаю обычно пару или больше), только передаю параметром в функции.


Pzz>Для возврата больших структур caller передает невидимый параметр, указатель на память, куда структуру отгружать. Т.е., это примерно как если явно передавать на нее указатель.


Хм, а разве возврат структур, да и остального, не через стек идёт?


Pzz>Но важно еще и то, как ты в конечном итоге с ней работаешь. Если это структура не стеке, это одно, а если для нее где-то аллоцируется а потом освобождается память, это совсем другое.


Структура всегда только на стеке, и там только POD-типы в членах.
Re[3]: Дорого ли нынче гонять структуры по значению?
От: ArtDenis Россия  
Дата: 07.08.24 14:58
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>написать хороший бенчмарк порой сложнее, чем полноценный код.


Для грубой оценки этого более чем достаточно. Главное при написании бенчмарка понимать как обойти такие оптимизации компилятора как инлайнинг функций, разворачивания циклов и другие прочие, которые сделают результат бенчмарка бессмысленным )

Но согласен, с реальным кодом может быть большая разница.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[4]: Дорого ли нынче гонять структуры по значению?
От: пффф  
Дата: 07.08.24 15:06
Оценка:
Здравствуйте, ArtDenis, Вы писали:

SP>>написать хороший бенчмарк порой сложнее, чем полноценный код.


AD>Для грубой оценки этого более чем достаточно. Главное при написании бенчмарка понимать как обойти такие оптимизации компилятора как инлайнинг функций, разворачивания циклов и другие прочие, которые сделают результат бенчмарка бессмысленным )


А я не хочу обходить инлайнинг, у меня весь код в хидерах, если компилятор считает, что надо инлайнить — пусть инлайнит


AD>Но согласен, с реальным кодом может быть большая разница.


Ну вот я и спрашивал, может у кого-то есть реальный опыт
Re[3]: Дорого ли нынче гонять структуры по значению?
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.08.24 16:40
Оценка:
Здравствуйте, пффф, Вы писали:

П>Хм, а разве возврат структур, да и остального, не через стек идёт?


Зависит от ABI. На x86-64 место для возврата структуры выделяет на своем стеке caller, а вызываемая процедура получает на него указатель.

Что до остального, в целом, если объем возвращаемого невелик, стараются использовать не стек, а регистры.

Pzz>>Но важно еще и то, как ты в конечном итоге с ней работаешь. Если это структура не стеке, это одно, а если для нее где-то аллоцируется а потом освобождается память, это совсем другое.


П>Структура всегда только на стеке, и там только POD-типы в членах.


Тогда, наверное, не дорого. В не слишком критичном по скорости месте (я таких мест в любой программе большинство) я бы исходил из удобства программирования. Ну а если скорость поджимает, надо делать бенчмарку, однако.
Re[5]: Дорого ли нынче гонять структуры по значению?
От: ArtDenis Россия  
Дата: 07.08.24 17:01
Оценка:
Здравствуйте, пффф, Вы писали:

П>Ну вот я и спрашивал, может у кого-то есть реальный опыт


Что значит реальный опыт? Когда меня не устраивает производительность, я профилирую и ускоряю узкие места (а то и архитектуру меняю), а не гадаю над придуманной проблемой
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Дорого ли нынче гонять структуры по значению?
От: 4058  
Дата: 08.08.24 09:39
Оценка: 8 (2)
Здравствуйте, пффф, Вы писали:

П>Есть структура, размером в три десятка байт (на x64 будет раза в два толще). Дорого ли её передавать по значению, на современных компах?


Чем структура больше указателя, тем дороже будет передача по значению, например:

// 32 bytes
struct vec4d
{
    double a, b, c, d;
};

__declspec(noinline) vec4d vec4d_plus_val(const vec4d v0, const vec4d v1)
{
    vec4d r = {v0.a + v1.a, v0.b + v1.b, v0.c + v1.c, v0.d + v1.d};
    return r;
}

__declspec(noinline) vec4d vec4d_plus_ref(const vec4d &v0, const vec4d &v1)
{
    vec4d r = {v0.a + v1.a, v0.b + v1.b, v0.c + v1.c, v0.d + v1.d};
    return r;
}

// perf test
... 
    time_t ts = clock();

    vec4d v0 = {0, 0, 0, 0};
    vec4d v1 = {1, 1, 1, 1};

    for(int i = 0; i < 100000000; i++)
    {
        v0 = vec4d_plus_val(v0, v1);
        //v0 = vec4d_plus_ref(v0, v1);
    }

    time_t te = clock();

    printf("vec: %f, %f, %f, %f; time: %d", v0.a, v0.b, v0.c, v0.d, te - ts);
...

time на моей машине для vec4d_plus_val составляет в среднем 600, а vec4d_plus_ref в среднем 440, т.е. разница стабильно около 35%.
(компилятор из состава MS VC++ 2008, откомпилировано в release (/o2))
Если не запрещать inline-инг, то разницы не будет, в обоих вариантах time в среднем = 140.

Другое дело контекст использования, если эта функция не частовызываемая числодробилка-битовыжималка, то на таком размере структуры разницы можно и не заметить (особенно если эта функция обращается например к I/O).
Re[2]: Дорого ли нынче гонять структуры по значению?
От: Умака Кумакаки Ниоткуда  
Дата: 09.08.24 06:44
Оценка:
Здравствуйте, 4058, Вы писали:

Ссылка на godbolt

https://godbolt.org/z/3rh5ro97a


последняя вкладка это дифф двух версий, видно что там где передача по значению два раза копируется по 32 байта через rep movsb
нормально делай — нормально будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.