2

したがって、読み込むファイルがあり、データがどのように設定されるかを知っています。たとえば、各改行の最初のトークンが double になることがわかっています。

私はスキャナーを使用していて、単純に scan.nextDouble() を使用して double を読み取っていましたが、代わりに Double.parseDouble(scan.next()) と言われたため、ファイルからデータを読み取るプロセスが高速化されました30 秒から 5 秒まで。

scan.nextInt() と Integer.parseInt(scan.next()) でも同じことが起こりました。

私が読んでいたファイルでは、約 40,000 行の行ごとに int double int int になりました。

では、何がそれほど速くなるのでしょうか?

4

2 に答える 2

5

これはすべて、scan.nextDouble() が後続の Stream から最も近い Doublelike 値を見つけるためです。次の文字列値が doublelike 値になるかどうかはわかりません。たとえば、

s = "abcde1234.5" scan.nextDouble(s) は 1234.5 になりますが、Double.parseDouble(scan.next()) はエラーをスローします。

詳細については、ソース コードを参照してください。

于 2012-08-12T01:35:14.490 に答える
5

Scannernext<Type>メソッドは、単に次のトークンを読み込んで適切なパーサーを呼び出すだけでなく、追加の作業を行っています。最初に、トークンがそのタイプに対して有効であることを正規表現と照合してチェックし、次にそれをマッサージしてロケール固有のビット (グループ区切り記号、小数点区切り記号など) を処理し、最後にそれをパーサーに渡します。

入力が説明した正確な形式であることが確実であり、異なるロケールからの入力によって引き起こされる潜在的な違いを考慮する必要がない場合は、通知された最適化を必ず使用してください。 .

于 2012-08-12T01:43:50.960 に答える