e2e4 писал(а):
1. Пускай каждая строка содержит по 256 символов
2. Пускай расхождение находится (если находится) всегда на последнем символе строки (уж невезет, так невезет ).
3. Размер первого массива: 6,4 Мб; Размер второго массива: 4 Мб. Легко помещаются в ОЗУ, а на современных процессорах еще и большая их часть поместится в L2 - кеше процессора. Таким образом, временем доступа пренебрегаем.
4. Считаем кол-во операций сравнения: .
5. Берем относительно современный (но и не топовый) одноядерный процессор Intel Pentium IV@3.2 GHz и смотрим, что у него около 10 MIPS, т.е. около 10 миллионов целочисленных операций в сек. Предполагаем, что операция сравнения не займет более 1-й целочисленной операции,
e2e4 писал(а):
Итого имеем 11 сек для исходной задачи (прикидочно)
e2e4 писал(а):
Результаты:
2. Массив 26 000 х 16 000 выполняется за 3,3 мин
Хотелось бы пояснить результат. Конечно, мой процессор послабее, чем Intel Pentium IV@3.2 GHz на 35%. Но это все ерунда. Основная моя ошибка - конечно, не был сделан учет на выполнение операций закгрузки в регистры, записи результатов обратно в память, индексацию строк. Плюс некоторые операции выполняются дольше, чем за 1 такт. Плюс прочие накладные расходы. Итого имеем
в среднем операций требуется на сравнение одного символа на данной архитектуре компьютера.
-- Пн окт 12, 2009 11:30:24 --Maslov писал(а):
Исходный код strncmp интеловского процессора выглядит просто пугающе
Вопрос: а разве библиотечные функции, входящие в поставки си-компилятора, не пишутся обычно сразу на асссемблере?
Предложение: если есть желание, можно завести отдельную тему и попробовать написать более удачную функцию strncmp на Си (challenge Микрософту так сказать), только обязательно сначала выработать критерии оценки "оптимальности" функции и методику тестирования. Что-то мне подсказывает, что более оптимально вряд ли получится, разве что последний "остаточный" цикл тоже развернуть.