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 такт. Плюс прочие накладные расходы. Итого имеем
![$\cfrac{3,3[min] * 60[\frac{sec}{min}]}{11[sec]*\frac{10[MIPS]}{7.4[MIPS]} } = 13,3$ $\cfrac{3,3[min] * 60[\frac{sec}{min}]}{11[sec]*\frac{10[MIPS]}{7.4[MIPS]} } = 13,3$](https://dxdy-03.korotkov.co.uk/f/2/c/a/2ca6f0e5105fba62784e7d36f11cd6ae82.png)
в среднем операций требуется на сравнение одного символа на данной архитектуре компьютера.
-- Пн окт 12, 2009 11:30:24 --Maslov писал(а):
Исходный код strncmp интеловского процессора выглядит просто пугающе
Вопрос: а разве библиотечные функции, входящие в поставки си-компилятора, не пишутся обычно сразу на асссемблере?
Предложение: если есть желание, можно завести отдельную тему и попробовать написать более удачную функцию strncmp на Си (challenge Микрософту так сказать), только обязательно сначала выработать критерии оценки "оптимальности" функции и методику тестирования. Что-то мне подсказывает, что более оптимально вряд ли получится, разве что последний "остаточный" цикл тоже развернуть.