LINUX.ORG.RU

Деление целых на 2 через битовый сдвиг - архаизм?

 


1

3
#include <iostream>
using namespace std;

int main()
{
	int v = 0;
	for(int i = 0; i < 2000 * 1000 * 1000; ++i) {
		v ^= i >> 1; /* i / 2 */
	}
	cout << v << endl;
	return 0;
}

Если битовый сдвиг заменить обычным делением, то время выполнения не изменится. Обе операции насколько мне известно занимают 1 такт. Запускал на x64.
Существуют ли архитектуры (arm, mips, ...), для которых эти и другие известные трюки - полноправная оптимизация?

UPD: при делении на 3, разница между сдвигом и делением ощутимая. Вопрос: как так, ведь обе инструкции за 1 такт выполняются?



Последнее исправление: nerdogeek (всего исправлений: 2)
Ответ на: комментарий от osh5pntp8

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

Уж позволь полюбопытствовать, на каком языке ты собираешься писать без оптимизаций?

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Уж позволь полюбопытствовать

не корми, лопнет.

drBatty ★★
()
Ответ на: комментарий от Waterlaz

Знаешь почему -O0 так тормазит? Не потому, что конпеляторы так сильно оптимизирует - а потому, что их кодоген так устроен. Они гинерят настолько пессимизированный код, что без оптимизатора смысла его юзать просто нет.

Это равносильно глабальному volatile. Volatile не выключает потимизацию, а делает кое что другое - он не даёт коду юзать нормальной регистры,кеш и конвейер - а именно это основа производительности на том же х86. Ибо выхлоп -O0 ничем не отличается от примитивного байткода.

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

Сейчас у конпеляторов примитивный кодоген под каждый таргет, а потом обощенный оптимизатор. Пилить сложный кодеген под каждый таргет сложно.

Поэтому всё это возможно, но это убивает мейнстрим - и этого в мейнстримных конпеляторах никогда не будет, поэтому я и не против оптимизаций в мейнстримных конпеляторах.

А язык без оптимизаций - это макроассемблер.

osh5pntp8
()
Ответ на: комментарий от osh5pntp8

Конпеляторы можно писать с уже правильным кодогеном - которому не нужна оптимизация

Ждём osh5pntp8сс и osh5pntp8++.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.