ここには非常に多くのパフォーマンスのトレードオフがあるため、典型的なデータを測定するまで何が意味があるのかを知ることは不可能です.
このコードを保守する場合は、単純にする必要があります。 検索がまれであるか、ファイルが小さい場合は、線形検索を使用してください。コストが実際に問題になる場合は、いくつかの実験を行う必要があります。
線形検索の後に試みる 2 番目のことはmmap
、ファイルを検索して改行をスキャンすることです。これには直線的な時間がかかりstrchr
ますが、非常に高速になる可能性があります。ファイルが改行で終わることを保証できると役立ちます。行の境界が決まったら、二分探索を行うことで比較の数を少なく保つことができます。
考慮すべきもう 1 つのオプションは、Boyer-Moore 文字列検索です。これは準線形時間検索であり、検索パターンのサイズによっては、対数バイナリ検索よりも高速になる場合があります。Boyer-Moore は、長い検索文字列に特に適しています。
最後に、バイナリ検索が非常に優れているが、行の識別がパフォーマンスのボトルネックであると判断した場合は、各行の開始位置を事前に計算し、これらの事前計算された位置をバイナリ形式で補助ファイルに保存できます。
readline()
予測は 1 つだけでも構いません。 orのようなものを使用して一度に 1 行ずつ読むことは、ほぼ確実に避ける価値があります。この戦略では、常に行の内容を保持するためのfgets()
呼び出しが必要になるからです。malloc()
すべての回線で電話をかけるmalloc()
コストは、検索や比較のコストを圧倒する可能性があります。