大きなデータファイルをバイナリ形式でロード/保存すると、ASCIIエンコードされたファイルからデータをロードする場合よりも、プログラムの実行がはるかに速くなることに気づきました。
これはなぜですか?私の場合のデータは単純で、read()
またはfscanf()
以外の解析が制限されています。
fscanf()
自体を使用することで、おそらくそのほとんどが説明されます。 fscanf()
は、渡されたフォーマット文字列を解釈してから、ファイルから入力ストリームをスキャンし、指定されたパターンに一致させる必要があります。それは実際には膨大な作業です。 read()
は、指定されたバイト数をファイルから読み取るだけで、入力の解析を行う必要はありません。対照的に、fgets()は改行を監視する必要があるため、read()
よりも少し多くの作業を行いますが、fscanf()
よりもはるかに少ない作業を行います。
何を解析しているのか知らずに言うのは難しいですが...
テキストファイルは一般的に大きくなります。整数を4バイトにすることもできますが、値によっては10バイト(Windowsユニコードの場合は* 2)の数値を格納したいとします。
解析とフォーマットの両方が非常に遅くなる可能性があります。例えば。整数 "123"をバイナリに書き出したい-ちょうど4バイトをダンプすれば完了です。それを読み直し、4バイトを読み取り、問題を解決しました。
テキストでは、これにはバイナリ123を「123」に変換する方法を理解することが含まれます。これは非常に時間がかかり、それを書き込んでから、それを再度読み取ります。空白の間でテキストを解析し、各文字をオンにする必要があります(例:3読み取られて値に追加され、次に2が読み取られて10倍されて追加され、次に1が読み取られて100倍されて追加されます)。単純に4バイトで読み取るよりもはるかに遅くなることがわかると思います。