これは、連結の観点よりもパフォーマンスが高く、パフォーマンスもchar[]
優れているStringBuilder
と言われています。StringBuilder
string
StringBuilder
私のテストでは、ループの使用とstring
内部に大きな違いはありません。実際、これchar[]
が最も遅いです。
44列と130,000行の同じテーブルに対してテストしています。クエリはselect*from test
誰かが私が何か間違ったことをしたかどうかを確認するのを手伝ってもらえますか?
以下はコードです
//fetchByString(rd, fldCnt, delimiter, sw); // duration: 3 seconds
//fetchByBuilder(rd, fldCnt, delimiter, sw, rsize); // duration: 3 seconds
//fetchByCharArray(rd, fldCnt, delimiter, sw, rsize); // duration: 7 seconds
private void fetchByString(OracleDataReader pReader, int pFldCnt, string pDelimiter, StreamWriter pWriter)
{
while (pReader.Read())
{
string[] s = new string[pFldCnt];
for (Int32 j = 0; j < pFldCnt; j++)
{
if (pReader.IsDBNull(j))
{
s[j] = "";
}
else
{
s[j] = pReader.GetValue(j).ToString(); // correct value
}
}
pWriter.WriteLine(string.Join(pDelimiter, s));
}
}
private void fetchByBuilder(OracleDataReader pReader, int pFldCnt, string pDelimiter, StreamWriter pWriter, int pRowSzie)
{
StringBuilder sb = new StringBuilder(pRowSzie);
while (pReader.Read())
{
for (Int32 j = 0; j < pFldCnt; j++)
{
if (pReader.IsDBNull(j))
{
//sb.Append("");
sb.Append(pDelimiter);
}
else
{
sb.Append(pReader.GetValue(j).ToString()); // correct value
sb.Append(pDelimiter);
}
}
pWriter.WriteLine(sb.ToString());
sb.Clear();
}
}
private void fetchByCharArray(OracleDataReader pReader, int pFldCnt, string pDelimiter, StreamWriter pWriter, int pRowSzie)
{
char[] rowArray;
int sofar;
while (pReader.Read())
{
rowArray = new char[pRowSzie];
sofar = 0;
for (Int32 j = 0; j < pFldCnt; j++)
{
if (pReader.IsDBNull(j))
{
pDelimiter.CopyTo(0, rowArray, sofar, pDelimiter.Length);
sofar += pDelimiter.Length;
}
else
{
pReader.GetValue(j).ToString().CopyTo(0, rowArray, sofar, pReader.GetValue(j).ToString().Length);
sofar += pReader.GetValue(j).ToString().Length;
pDelimiter.CopyTo(0, rowArray, sofar, pDelimiter.Length);
sofar += pDelimiter.Length;
}
}
string a = new string(rowArray).TrimEnd('\0');
pWriter.WriteLine(a);
}
}