так сравнение должно быть только одно..dima писал(а):я чего по всему массиву идти - нашел первый ноль и выходи.sz писал(а):Ну, например, вот так:
bool HasZeroes( const unsigned* array, unsigned size )
{
unsigned result = 1;
for( ; size != 0; --size,++array ) result &= *array-1^*array;
return result == 0;
}
Компилировать и запускать не пытался, так что больно не драться, если что. Просто демонстрирует идею.
bool HasZeroes( const unsigned* array, unsigned size )
{
for( ; size != 0; size--,array++ )
{
if(*array == 0)
return true
}
return false;
}
Массив с нулём
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Аман Ванкуверский
- Маньяк
- Сообщения: 2759
- Зарегистрирован: 18 окт 2005, 01:10
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
Любой набор битовых операци числом меньше 10 (а иногда и больше) быстрее сравнения. От процессора практически не зависит.ajkj3em писал(а):чтобы понять если ли ноль, надо что-то сделать с каждым
елементом (и может быть что-то еще дополнительно). вопрос состоит
в том будет ли вто что-то быстрее или медленнее операции
сравнения.
На PowerPC есть команда select. Она бы эту задачу сильно ускорила, но на Intel ее нету.
Какой код быстрее?ajkj3em писал(а):твои пример с &&= прекрасное тому подтверждение - в зависимости
от платформы операция приведения int'a к 0 или 1 может быть
имплементирована сильно по-разному, и в результате такой метод
может оказаться как быстрее так и медленнее тривиального.
inline bool IsInRange( int value, int min, int max )
{
return value >= min && value <= max;
}
или
inline bool IsInRange( int value, int min, int max )
{
return (((int)(value >= min)) & ((int)(value <= max))) == 0;
}
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
- Аман Ванкуверский
- Маньяк
- Сообщения: 2759
- Зарегистрирован: 18 окт 2005, 01:10
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
Перемножение против сравнения - действительно, вопрос.Аман Ванкуверский писал(а):тот же вариант с перемножением, например, отвечает всем условиям задачи. а будет ли это работать быстрее или меделеннее исходного кода, зависит от платформы
Если большинство сравнений правильно предскажутся, то умножение проиграет. Если нет, то скорее всего, выиграет. От платформы, действительно зависит.
А вот битовые операции выиграют практически всегда. Если не брать совсем уж допотопных платформ.
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
и явный loop из этих операций будет быстрее "rep scasb" ? не верюsz писал(а):Любой набор битовых операци числом меньше 10 (а иногда и больше) быстрее сравнения. От процессора практически не зависит.ajkj3em писал(а):чтобы понять если ли ноль, надо что-то сделать с каждым
елементом (и может быть что-то еще дополнительно). вопрос состоит
в том будет ли вто что-то быстрее или медленнее операции
сравнения.
зависит от компилятораКакой код быстрее?
* перевод с транслита
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Код: Выделить всё
bool func(const int* array, size_t size) {
int tmp = size/2;
int result = 1;
for(; *(result)&*(reslult+1) && tmp; tmp--, result+=2);
return (tmp*2==size) ? (tmp!=0) : (tmp!=0 || *(array+size)==0);
}
- Аман Ванкуверский
- Маньяк
- Сообщения: 2759
- Зарегистрирован: 18 окт 2005, 01:10
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
ну так, нас просили оптимизировать что-то под абстрактную платформу.sz писал(а):Нас, кажется, на Си просили написать?ajkj3em писал(а):и явный loop из этих операций будет быстрее "rep scasb" ? не верю
чисто алгоритмической оптимизации здесь нет, так что задача либо
не имеет решения, либо она не полностью определена. оптимизировать
xor'ами в таком контексте смысла нет.
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
Но сейчас нет платформ на которых замена if-ов xor-ами не давала бы улучшения. А платформ на которых нету rep scasb - сколько угодно.ajkj3em писал(а):ну так, нас просили оптимизировать что-то под абстрактную платформу.
Кстати говоря, на xbox360 MemSet128 дерет по производительности аналогичную ассемблерную команду, как сидорову козу. Но там, конечно, действительно, оптимизация сильно заточенная под архитектуру. Я просто привожу, как пример того, что rep scasb - тоже не панацея.
А вопрос был и не на алгоритмическую оптимизацию. А на знание основных техник оптимизации. Совсем неплохой вопрос, кстати сказать. Когда тебе интервьюируемый на него начинает вопрошать "нафига", сразу ясно, что на низком уровне оптимизацией никогда не занимался. То есть, вопрос идеальный для интервью - сразу дает точный ответ, кто перед тобой.ajkj3em писал(а):чисто алгоритмической оптимизации здесь нет, так что задача либо
не имеет решения, либо она не полностью определена. оптимизировать
xor'ами в таком контексте смысла нет.
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline