Записать функцию round () с использованием побитовой операции? - PullRequest
0 голосов
/ 30 января 2019

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

Может кто-нибудь объяснить, как преобразовать эти операции в побитовые операции и почему?И как они могут оптимизировать время выполнения программы, если они делают то же самое?

Спасибо за вашу помощь!

stock round(num)
{
    new rem = num % 10;
    return rem >= 5 ? (num - rem + 10) : (num - rem);
}

1 Ответ

0 голосов
/ 30 января 2019
(num + 5) / 10 * 10

будет трудно победить: проверьте сборку (особенно деление) и дайте компилятору оптимизировать работу с побитовыми операциями, если он сочтет их более быстрыми.В вашей версии есть ветвление, из-за которого конвейер может создать дамп с неверным прогнозом ветвления.

...