SQLサーバーからできるだけ早くデータを読み取る方法を試しています。興味深い発見が出ました。 List<string[]>
の代わりにList<object[]>
にデータを読み取ると、パフォーマンスが2倍以上向上します。SqlDataReaderパフォーマンスリスト<string[]>またはリスト<object[]>
これはフィールド上でToString()
メソッドを呼び出す必要がないと思われますが、オブジェクトを使用するとパフォーマンスに悪影響が及ぶと常に考えていました。
文字列配列の代わりにオブジェクト配列のリストを使用しない理由はありますか?
EDIT:このデータの保存容量は私が持っていたものの1つです。オブジェクト配列にデータを格納するのは文字列よりも余裕がありますか?
private void executeSqlObject()
{
List<object[]> list = new List<object[]>();
using (SqlConnection cnn = new SqlConnection(_cnnString))
{
cnn.Open();
SqlCommand cmd = new SqlCommand("select * from test_table", cnn);
SqlDataReader reader = cmd.ExecuteReader();
int fieldCount = reader.FieldCount;
while (reader.Read())
{
object[] row = new object[fieldCount];
for (int i = 0; i < fieldCount; i++)
{
row[i] = reader[i];
}
list.Add(row);
}
}
}
private void executeSqlString()
{
List<string[]> list = new List<string[]>();
using (SqlConnection cnn = new SqlConnection(_cnnString))
{
cnn.Open();
SqlCommand cmd = new SqlCommand("select * from test_table", cnn);
SqlDataReader reader = cmd.ExecuteReader();
int fieldCount = reader.FieldCount;
while (reader.Read())
{
string[] row = new string[fieldCount];
for (int i = 0; i < fieldCount; i++)
{
row[i] = reader[i].ToString();
}
list.Add(row);
}
}
}
private void runTests()
{
Stopwatch watch = new Stopwatch();
for (int i = 0; i < 10; i++)
{
watch.Start();
executeSqlObject();
Debug.WriteLine("Object Time: " + watch.ElapsedMilliseconds.ToString());
watch.Reset();
}
for (int i = 0; i < 10; i++)
{
watch.Start();
executeSqlString();
Debug.WriteLine("String Time: " + watch.ElapsedMilliseconds.ToString());
watch.Reset();
}
}
と結果:あなたは追加ボクシングを起こしている場合
Object Time: 879
Object Time: 812
Object Time: 825
Object Time: 882
Object Time: 880
Object Time: 905
Object Time: 815
Object Time: 799
Object Time: 823
Object Time: 817
Average: 844
String Time: 1819
String Time: 1790
String Time: 1787
String Time: 1856
String Time: 1795
String Time: 1731
String Time: 1792
String Time: 1799
String Time: 1762
String Time: 1869
Average: 1800
結果と主張することはできません。また、メモリをリークする可能性があるため、読者(およびコマンド)もステートメントを使用してラップする必要があります。 –
テストには何か問題があります...データベースからデータを読み込むのと比較して、文字列型チェック*を間違っていなければなりません。 – Guffa
好奇心を失って、ToString()を呼び出すのではなく、リーダの値を文字列( 'row [i] =(string)reader [i];')にキャストするか、組み込みの 'SqlDataReader.GetString()'メソッドを使用して値を取得します( 'row [i] = reader.GetString(i);')? (すべての列の値は文字列です) –