가능한 빨리 SQL 서버에서 데이터를 읽는 방법을 실험 해본 결과 흥미로운 발견이 나타났습니다. List<string[]>
대신 List<object[]>
으로 데이터를 읽으면 성능이 두 배 이상 향상됩니다.SqlDataReader 성능 목록 <string[]> 또는 목록 <object[]>
이것은 필드에 ToString()
메서드를 호출 할 필요가 없기 때문에 의심 스럽지만 항상 개체를 사용하면 성능에 부정적인 영향을 줄 것이라고 생각했습니다.
문자열 배열 대신 개체 배열 목록을 사용하지 않는 이유가 있습니까?
편집 : 방금 한 가지 생각은이 데이터의 저장 크기입니다. 객체 배열에 데이터를 저장하는 것이 문자열보다 많은 공간을 차지합니까?
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);)? (모든 열 값은 문자열입니다.) –