DataReader
Read
पर जा रहा है जो केवल एकमात्र, एक-पंक्ति-पर-समय दृष्टिकोण है, जो क्रमशः डेटा पढ़ता है ताकि आप कनेक्ट होने पर पढ़े जाने पर जैसे ही रिकॉर्ड प्राप्त कर सकें, स्मृति और प्रदर्शन के लिए सबसे अच्छा है।
ने कहा कि, दो दृष्टिकोणों के बीच, मुझे DataTable.Load
से बहुत तेज लगता है। पाठ्यक्रम कि कार्यान्वयन पर निर्भर करता है की .. यहाँ दो जो मैं here पोस्ट के बीच एक बेंचमार्क है:
public DataTable Read1<T>(string query) where T : IDbConnection, new()
{
using (var conn = new T())
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = query;
cmd.Connection.ConnectionString = _connectionString;
cmd.Connection.Open();
var table = new DataTable();
table.Load(cmd.ExecuteReader());
return table;
}
}
}
public DataTable Read2<S, T>(string query) where S : IDbConnection, new()
where T : IDbDataAdapter, IDisposable, new()
{
using (var conn = new S())
{
using (var da = new T())
{
using (da.SelectCommand = conn.CreateCommand())
{
da.SelectCommand.CommandText = query;
da.SelectCommand.Connection.ConnectionString = _connectionString;
DataSet ds = new DataSet(); //conn is opened by dataadapter
da.Fill(ds);
return ds.Tables[0];
}
}
}
}
दूसरा दृष्टिकोण हमेशा पहले से बेहतर प्रदर्शन किया।
Stopwatch sw = Stopwatch.StartNew();
DataTable dt = null;
for (int i = 0; i < 100; i++)
{
dt = Read1<MySqlConnection>(query); // ~9800ms
dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms
dt = Read1<SQLiteConnection>(query); // ~4000ms
dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms
dt = Read1<SqlCeConnection>(query); // ~5700ms
dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms
dt = Read1<SqlConnection>(query); // ~850ms
dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms
dt = Read1<VistaDBConnection>(query); // ~3900ms
dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms
}
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
Read1
आंखों पर बेहतर लग रहा है, लेकिन डेटा एडाप्टर बेहतर प्रदर्शन करती है (भ्रमित करने के लिए नहीं है कि एक डाटाबेस अन्य से बेहतर प्रदर्शन किया, प्रश्नों सभी विभिन्न थे)। हालांकि दोनों के बीच का अंतर क्वेरी पर निर्भर था। कारण यह हो सकता है कि Load
पंक्तियों को जोड़ने के दौरान पंक्तियों को from the documentation द्वारा पंक्तियों की जांच करने की आवश्यकता है (DataTable
पर इसकी एक विधि) जबकि Fill
डेटाएडाप्टर पर है जो केवल इसके लिए डिज़ाइन किए गए थे - डेटाटेबल्स की तेज़ रचना।
मेरी पोस्ट देखें: यह डेटा एडाप्टर का उपयोग करने से कम कोड है। –