Здесь так много компромиссов в производительности, что невозможно понять, что имеет смысл, пока у вас не будет измерений на типовых данных.
Если вы собираетесь сохранить этот код, он должен быть простым. Если поиск выполняется редко или файл небольшой, используйте линейный поиск. Если стоимость действительно имеет значение, вам придется провести несколько экспериментов.
Второе, что я бы попробовал после линейного поиска, - это mmap
файл и просмотр его на наличие новых строк. Это занимает линейное время, но strchr
может быть очень быстрым. Это помогает, если вы можете гарантировать, что файл заканчивается новой строкой. Как только вы разметите линии, вы можете сохранить небольшое количество сравнений, выполнив бинарный поиск.
Другой вариант, который вы должны рассмотреть, - поиск строки Бойера-Мура. Это сублинейный поиск по времени, и в зависимости от размера шаблона поиска он может быть быстрее, чем логарифмический двоичный поиск. Бойер-Мур особенно хорош с длинными поисковыми строками.
Наконец, если вы определите, что бинарный поиск действительно хорош, но определение строк является узким местом производительности, вы можете предварительно вычислить начальное местоположение каждой строки и сохранить эти предварительно вычисленные местоположения в двоичном формате во вспомогательном файле.
Я чувствую себя комфортно, делая только одно предсказание: почти наверняка стоит избегать чтения по одной строке за раз с чем-то вроде readline()
или fgets()
, потому что эта стратегия неизменно включает в себя вызов malloc()
для хранения содержимого линия. Стоимость звонка malloc()
на каждую линию, вероятно, будет завышать любые затраты на поиск или сравнение.