Информация об изменениях

Сообщение 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):

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):

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