2011-08-10 4 views
0

私は文字列でいくつかのテストをやろうとしていると私は、この記事を見て:Is StringBuilder really faster than Aggreggate?C#Stringポインタのパフォーマンスを備えたマニピュレーション?

とポインタは全く文字列ビルダオブジェクトの上に任意のパフォーマンスを得るならば、私は興味が?私が尋ねるのは、レポートを作成し、データをExcelにエクスポートするWindowsサービスがあるということです(xmlを使用し、あらゆる種類のオブジェクトを処理するわけではありません)ので、文字列は一部のレポートでは非常に大きくなります。 stringBuilderを使用すると、DBからデータを取得するのに約5秒、レポートの文字列を作成するのに8時間かかります。これは共同作業者のコードなので、今は投稿する例はありませんが、入手できないかどうかはわかります。ポインターを使った文字列の作成がstringbuilderよりも速ければ全体的に不思議です。

おかげで、

クリス

+4

5秒分のデータが処理に8時間かかる場合は、何か間違っていることがあります。これは、StringBuilderを使用するかどうかを選択するだけではありません。 –

+0

テキストのみに基づいてフィードバックを提供することは困難です。いくつかのコードを教えてください。 –

+0

私はアプリケーションで文字列を作成することで常に良いパフォーマンスを得ていることに完全に同意します。 @Brian、私は今日同僚とこのサービスをテストしています。自分自身でコードを調べて、午後の例を掲載したいと考えています。 – Chris

答えて

1

8時間?巨大なレポートでなければなりません。ストリング(h ttp://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx)の代わりにStringBuilderを試してみることができます。あなたの質問から、あなたはそれをファイルに書き込んでいると思います。 Strinbuilderはあなたの巨大な文字列のためにもっと多くのメモリを割り当てることに多分時間を費やしているかもしれないので、ファイルストリームに直接書き込むほうが効率的かもしれません。

+0

この記事をありがとうございました。はい、終了したらファイルに文字列を書き込みます。私はストリームライターオブジェクトにあまり慣れていないので、私はそれを調べます。DBコールは約340,000レコードを5〜6列ずつ返しますが、単純な選択で完了します。 – Chris

0

状況によって異なります。文字列の問題は、文字列を変更できないことです。したがって、変更が必要なときはいつでも、新しい文字列が作成され、すべての情報が新しい文字列にコピーされます。 Stringbuilderは配列で動作するため、文字を実際に簡単に変更する必要がある場合に使用します。しかし、データを挿入する必要がある場合、挿入後の部分を移動する必要があり、文字が配列に収まらなくなると、新しい配列を作成して古いデータをコピーする必要があります。

Stringbuilder内部の配列は成長し続け、古いデータを毎回コピーする必要があります。たとえば、Stringbuilderに4ページのスペースがある場合、ある時点で(通常は2倍)8ページのスペースを予約する必要があり、その後4ページのデータをコピーする必要があります。

これは、過剰な時間が使用された原因となります。

代わりにストリームを使用すると、ハードウェアはストリームの割り当てメモリを増やすだけです。その後、すべての古いデータをコピーする必要はありません。

ポインタについて:必要なスペースをあらかじめ知っていれば助けになります。そうしないと、別のプログラムのメモリを上書きすることになります。しかし、あなたは、あなたがStringBuilderのためにそれを使用することができます使用しようとしている、事前にどのくらいのデータを知っている場合:

new System.Text.StringBuilder(amountOfCharsNeeded); 

編集:C++のように使ってポインタが効果的にメモリ使用量とパフォーマンスの面でのStringBuilderを使用するのと同じになりますあなただけが自分でデータを管理します。

+0

私は文字列がバックグラウンドでどのように動作するかについての記事をさらに読み、その用語を見てきました。私はStringBuilderがスペースを予約する方法については知らなかったが、それは私には意味をなさない。お返事ありがとうございます。私はポインタを使う必要がないことを願っています。私は本当にいくつかの機能を最適化する必要があると思います。 – Chris

関連する問題