double
の値が何百万もの大規模なCSVのようなファイルを書くと、ボトルネックは二重からストリングへの変換のようです。最速の二重ストリング変換
StreamWriter
に二重の値を追加する最も早い方法は、ポイントの後に固定された桁数を使用しますか?
現在、私は私が代わりに、二重の文字列定数を記述する場合、プログラムが速く10回を終了
// called once
System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo();
nfi.NumberDecimalDigits = 4;
// called millions of times in a loop
streamwriter.Write(mydouble.ToString(nfi));
を使用しています。
doubleの代わりにintを書くと、それはまだ2倍以上の速さです。
(すべてのテストはデバッガを接続せずにリリースモードで実行されました)
このダブルを文字列に変換する最も速い方法は何ですか?
私は以下の私の問題を説明するためのベンチマークが含まれている:
私は、行の100倍、ファイルへの100万倍を書きます。
合計時間は25.2秒です。 double.ToStringのみのループで、streamwriter.Writeは21秒で終了しません。 のみstreamwriter.Writeとのループは、文字列に二重の変換3.5秒
System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo();
nfi.NumberDecimalDigits = 4;
double d = 0.1234;
Stopwatch watch;
watch = Stopwatch.StartNew();
for (int i = 0; i < 100; i++)
{
using (StreamWriter sw = new StreamWriter(@"c:\temp\test.txt", false, Encoding.UTF8, 65536))
{
for (int j = 0; j < 1000000; j++)
{
sw.Write(d.ToString(nfi));
}
}
}
Console.WriteLine("stream.Write & double.ToString: {0}", watch.ElapsedMilliseconds);
watch = Stopwatch.StartNew();
for (int i = 0; i < 100; i++)
{
using (StreamWriter sw = new StreamWriter(@"c:\temp\test.txt", false, Encoding.UTF8, 65536))
{
for (int j = 0; j < 1000000; j++)
{
sw.Write("0.1234");
}
}
}
Console.WriteLine("only stream.Write: {0}", watch.ElapsedMilliseconds);
watch = Stopwatch.StartNew();
for (int i = 0; i < 100; i++)
{
using (StreamWriter sw = new StreamWriter(@"c:\temp\test.txt", false, Encoding.UTF8, 65536))
{
for (int j = 0; j < 1000000; j++)
{
string s = d.ToString(nfi);
}
}
}
Console.WriteLine("only double.ToString: {0}", watch.ElapsedMilliseconds);
興味深い:[ここ](http://cc.davelozinski.com/c-sharp/fastest-way- to-string-to-string)、int型の文字列変換のテストが行われ、 'ToString()'が最も優れていることが判明しました。 –
私は前に他のメソッドのいくつかを試しました。以前はString.Formatを使用していましたが、double.ToStringは高速に見えました。しかし、私はまだもっと良い方法を見つけようとしています。このような操作は、ディスクの速度ではなく、ファイルを書き込む際のボトルネックとなるのが奇妙です。 – HugoRune
アプリケーションがDEBUGまたはRELEASEを使用して構築されている場合、速度は異なります。リリースでは、組み込みコプロセッサを使用して浮動小数点演算を行い、DEBUGはコプロセッサをシミュレートします。 – jdweng