Сообщение Re[9]: замеры) от 27.07.2023 14:50
Изменено 27.07.2023 14:54 pilgrim_
Re[9]: замеры)
Здравствуйте, Sm0ke, Вы писали:
S>Мне интересно почему for + div() медленнее, чем for?
S>Ведь казалось бы мы делаем две операции (деление и остаток) за одну инструкцию. Но видимо в std накосячили и что-то пошло не так. Или вообще что случилось?
Похоже что из-за отсутствия инлайна std::div (выполняется call)
Добавил mydiv и mydiv_noinline (эмуляция вызова std::div):
Судя по asm смартовый оптимизатор выполняет idiv — та самая одна инструкция (частное в rax, остаток в rdx), а при инлайне mydiv заменяет её код на test (AND) и сдвиг (как в варианте mcq)
https://godbolt.org/z/a98Wv3bTM
S>Мне интересно почему for + div() медленнее, чем for?
S>Ведь казалось бы мы делаем две операции (деление и остаток) за одну инструкцию. Но видимо в std накосячили и что-то пошло не так. Или вообще что случилось?
Похоже что из-за отсутствия инлайна std::div (выполняется call)
Добавил mydiv и mydiv_noinline (эмуляция вызова std::div):
std::div_t mydiv(int x, int y)
{
return { x / y, x % y };
}
std::div_t __attribute__ ((noinline)) mydiv_noinline(int x, int y)
{
return { x / y, x % y };
}
Судя по asm смартовый оптимизатор выполняет idiv — та самая одна инструкция (частное в rax, остаток в rdx), а при инлайне mydiv заменяет её код на test (AND) и сдвиг (как в варианте mcq)
mydiv_noinline(int, int):
mov eax, edi
cdq
idiv esi
sal rdx, 32
or rax, rdx
ret
https://godbolt.org/z/a98Wv3bTM
for mydiv_noinline: 670us
for mydiv_noinline: 493us
for mydiv: 130us
for mydiv: 129us
mcq: 140us
mcq: 148us
for: 159us
for: 133us
algo: 264us
algo: 265us
for div: 529us
for div: 645us
algo div: 1039us
algo div: 765us
Re[9]: замеры)
Здравствуйте, Sm0ke, Вы писали:
S>Мне интересно почему for + div() медленнее, чем for?
S>Ведь казалось бы мы делаем две операции (деление и остаток) за одну инструкцию. Но видимо в std накосячили и что-то пошло не так. Или вообще что случилось?
Похоже что из-за отсутствия инлайна std::div (выполняется call)
Добавил mydiv и mydiv_noinline (эмуляция вызова std::div):
Судя по asm смартовый оптимизатор выполняет idiv — та самая одна инструкция (частное в rax, остаток в rdx), а при инлайне mydiv заменяет её код на test (AND) и сдвиг (как в варианте mcq, да и в for такой же код генерится)
https://godbolt.org/z/a98Wv3bTM
S>Мне интересно почему for + div() медленнее, чем for?
S>Ведь казалось бы мы делаем две операции (деление и остаток) за одну инструкцию. Но видимо в std накосячили и что-то пошло не так. Или вообще что случилось?
Похоже что из-за отсутствия инлайна std::div (выполняется call)
Добавил mydiv и mydiv_noinline (эмуляция вызова std::div):
std::div_t mydiv(int x, int y)
{
return { x / y, x % y };
}
std::div_t __attribute__ ((noinline)) mydiv_noinline(int x, int y)
{
return { x / y, x % y };
}
Судя по asm смартовый оптимизатор выполняет idiv — та самая одна инструкция (частное в rax, остаток в rdx), а при инлайне mydiv заменяет её код на test (AND) и сдвиг (как в варианте mcq, да и в for такой же код генерится)
mydiv_noinline(int, int):
mov eax, edi
cdq
idiv esi
sal rdx, 32
or rax, rdx
ret
https://godbolt.org/z/a98Wv3bTM
for mydiv_noinline: 670us
for mydiv_noinline: 493us
for mydiv: 130us
for mydiv: 129us
mcq: 140us
mcq: 148us
for: 159us
for: 133us
algo: 264us
algo: 265us
for div: 529us
for div: 645us
algo div: 1039us
algo div: 765us