मैं तरीके जितनी जल्दी संभव हो एक एसक्यूएल सर्वर से डेटा को पढ़ने के लिए प्रयोग कर रहे हैं और मैं एक रोचक खोज बारे में जाना। यदि मैं के बजाय 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
परिणाम के साथ बहस नहीं कर सकता। आपको बयानों का उपयोग करने में अपने पाठकों (और कमांड भी) को लपेटना चाहिए क्योंकि वे स्मृति को रिसाव कर सकते हैं। –
परीक्षण के साथ कुछ गड़बड़ होनी चाहिए ... डेटाबेस से डेटा पढ़ने की तुलना में, स्ट्रिंग प्रकार की जांच करना * चाहिए * negligigle होना चाहिए। – Guffa
जिज्ञासा से बाहर, क्या आप किसी भी स्ट्रिंग ('पंक्ति [i] = (स्ट्रिंग) पाठक [i]; ') पर पाठक मान को केवल उस पर अलग करते हैं, इसके बजाय' ToString() 'को कॉल करने के बजाय, या इसके बजाय, मूल्य को पुनः प्राप्त करने के लिए अंतर्निहित 'SqlDataReader.GetString()' विधि का उपयोग करके ('पंक्ति [i] = reader.GetString (i);')? (सभी कॉलम मानों को समझना तार हैं।) –