Собственно, сабж. Можно ли ускорить поиск дворда в строке примерно на порядок при одном из следующих условий (естественно, алгоритмы м.б. разные): а) дворд встречается около 10 раз в 4 кб данных б) дворд встречается около 4000 раз в 4 кб данных в) 0 или 1 раз в 4 кб данных г) максимум два раза в 4 Мб данных Раельно ли получить выигрыш на порядок, заморочившись оптимизацией, или не стоит тратить времени?
Хорошо подумал и решил забить на оптимизацию. Проще оказалось наложить дополнительные ограничения на данные
koderr gilg Заранее сказать трудно - может и в десять получится, без конкретных измерений на современных аццких машинах что-то не угадаешь.
Не удержался - попробовал на моем рабочем Prescott'е обыкновенная замена циклом раскрученым х4 дает на переборе 4К выигрыш порядка в два раза. Но то, конечно, тот еще танк - на Athlon или новомодном Core 2 такой сладкой халявы уже не будет. [offtop] и вообще, где leo? позовите слесаря! (с) [/offtop] посмотри Фога - это у него рассматривается от и до, как классический случай.
gilg Э-э-э... обманул немножко... Я имел ввиду что-то типа фоговского strlen, но у него там работа с БАЙТАМИ упаковаными в DWORD'ы... а с dword'ами даже не знаю - можно попробовать SSE, но что-то мне подсказывает, что нелегко это будет... основная проблема - цикл вида while(xmm0 == 0) - вот что-то торможу и не могу придумать как это эффективно сделать
Ustus Потоковые инструкции по-любому не катят - нужна переносимость. Пересмотром алгоритма избавился от третьего вложенного цикла, и все залетало. Иногда все-таки думать полезно бывает )
gilg Ну... разве что иногда Все равно у меня на SSE быстрее не получилось, на танке с гордым именем Prescott, во всяком случае. Правда, оптимизатор из меня тот еще Там сплошная цепочка зависимостей и как ее разгрести - ума не приложу. Что-то типа такого: Code (Text): ll: movdqa xmm1, [eax][ecx] pcmpeqd xmm1, xmm0 pmovmskb ebx, xmm1 or ebx, ebx jnz bb add ecx, 16 jnz ll