winforms C # .NET - छोरों का उपयोग करते समय मेरे कोड के प्रदर्शन को कैसे सुधारें (के लिए, foreach, आदि…) [बंद]
मैं कॉलेजों के लिए एक ऐप विकसित कर रहा हूं, ऐप का एक हिस्सा कक्षाओं का साप्ताहिक कार्यक्रम निर्धारित करना है।
मेरे पैरामीटर क्लासरूम नंबर, सप्ताह का दिन और टाइम स्लॉट हैं।
इसलिए मेरे पास कक्षाओं की एक श्रेणी है, प्रत्येक कक्षा में एक नंबर है।
रन-टाइम में, ऐप मेरे डेटाबेस पर कितने क्लासरूम हैं और प्रत्येक बटन पर क्लासरूम नंबर सेट करता है, इसके आधार पर कुछ बटन जेनरेट करता है।
यदि मैं करना चाहता हूं तो प्रत्येक कक्षा के बटन को "रेड" बैककवर के साथ लेबल करें यदि उस निश्चित दिन को सप्ताह के दिए गए दिन और दिए गए टाइम स्लॉट में पूरा किया गया है।
मैंने पूरा किया है कि मैं क्या करना चाहता था और मेरा कोड बिना किसी त्रुटि के काम करता है, लेकिन मेरी एकमात्र समस्या अब प्रदर्शन है।
यहाँ मेरा कोड है:
private OleDbConnection Connection = new OleDbConnection();
private void SomeMethod(string Day, string Time)
{
int MaxIndex = 0;
string str1 = "select Max([Row Index]) from Table";
OleDbCommand Command1 = new OleDbCommand(str1, Connection);
Connection.Open();
if (Command1.ExecuteScalar() == DBNull.Value)
MaxIndex = 1;
else
MaxIndex = Convert.ToInt32(Command1.ExecuteScalar());
Connection.Close();
for (int i = 0; i < MaxIndex; i++)
{
string str = "select [classroom Number] from Table where [Day] = @ParamDay and [Time] = @ParamTime and [Row Index] = @ParamIndex";
OleDbCommand Command = new OleDbCommand(str, Connection);
Command.Parameters.Add("@ParamDay", Day);
Command.Parameters.Add("@ParamTime", Time);
Command.Parameters.Add("@ParamIndex", i + 1);
Connection.Open();
OleDbDataReader reader = Command.ExecuteReader();
if (reader.Read())
{
foreach (Button btn in ButtonsPanel.Controls)
{
if (btn.Text == reader["classroom Number"].ToString())
{
btn.BackColor = Color.Red;
}
}
Connection.Close();
}
}
}
इसलिए इस कोड के बारे में 13 सेकंड लगते हैं अगर मेरे पास 200 पंक्तियाँ हैं जिनकी मुझे उम्मीद है।
सवाल यह है कि ... क्या मैं अपने कोड में कुछ भी कर सकता हूं ताकि ये 13 सेकंड कम से कम 2-4 सेकंड तक कम हो जाएं?
जानकारी के लिए: मैंने इंटरनेट पर बहुत खोज की है, लेकिन यहां मेरे मुद्दे का हल नहीं खोज सका।
जवाब
आपको चक्र की आवश्यकता बिल्कुल नहीं लगती है। और MaxIndex
या तो। समय और निशान बटन के लिए रिकॉर्ड डाउनलोड करें।
private void SomeMethod(string Day, string Time)
{
HashSet<string> classNumbers = new HashSet<string>();
string str = "select [classroom Number] from Table where [Day] = @ParamDay and [Time] = @ParamTime";
using (OleDbCommand Command = new OleDbCommand(str, Connection))
{
Command.Parameters.Add("@ParamDay", Day);
Command.Parameters.Add("@ParamTime", Time);
Connection.Open();
using (OleDbDataReader reader = Command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
classNumbers.Add(reader["classroom Number"].ToString());
}
}
}
foreach (Button btn in ButtonsPanel.Controls)
{
if (classNumbers.Contains(btn.Text))
{
btn.BackColor = Color.Red;
}
}
}
दो चीजें हैं जिन्हें आप सुधार सकते हैं:
- केवल एक बार कनेक्शन को खोलें और बंद करें जिससे कोड रनिंग टाइम कम हो सके।
- वह सभी डेटा प्राप्त करें जो आप एक क्वेरी में संसाधित करना चाहते हैं।
नीचे दिए गए कोड की जाँच करें:
private OleDbConnection Connection = new OleDbConnection();
private void SomeMethod(string Day, string Time)
{
int MaxIndex = 0;
string str1 = "select Max([Row Index]) from Table";
OleDbCommand Command1 = new OleDbCommand(str1, Connection);
Connection.Open();
if (Command1.ExecuteScalar() == DBNull.Value)
MaxIndex = 1;
else
MaxIndex = Convert.ToInt32(Command1.ExecuteScalar());
string str = "select [classroom Number] from Table where [Day] = @ParamDay and [Time] = @ParamTime and [Row Index] between 1 and @ParamIndex";
OleDbCommand Command = new OleDbCommand(str, Connection);
Command.Parameters.Add("@ParamDay", Day);
Command.Parameters.Add("@ParamTime", Time);
Command.Parameters.Add("@ParamIndex", MaxIndex);
OleDbDataReader reader = Command.ExecuteReader();
while (reader.Read())
{
foreach (Button btn in ButtonsPanel.Controls)
{
if (btn.Text == reader["classroom Number"].ToString())
{
btn.BackColor = Color.Red;
}
}
}
Connection.Close();
}
मेरी टिप्पणियों के अनुसार, आपको केवल एक बार क्वेरी को निष्पादित करना होगा और परिणाम सेट के माध्यम से लूप करना होगा। इससे प्रदर्शन लाभ होगा क्योंकि अब आप केवल एक बार IO तक पहुंच रहे हैं, क्योंकि IO आमतौर पर बहुत धीमा है।
यहाँ एक उदाहरण है (परीक्षण नहीं किया गया है):
private void SomeMethod(string day, string time)
{
// Using statement helps to dispose any resources once done with the connection
// connectionString can be any string that opens your database
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
// The query has removed the notion of index, it will just get all the data for that day and time
string query = "SELECT [classroom Number] FROM Table WHERE [Day] = @ParamDay AND [Time] = @ParamTime";
// Since OleDbCommand inherits from IDisposable, use a using statement
using (OleDbCommand command = new OleDbCommand(query, connection))
{
// Notice how we don't use index anymore
command.Parameters.Add("@ParamDay", day);
command.Parameters.Add("@ParamTime", time);
// Open connection here, don't need to close connection
connection.Open();
// Since OleDbDataReader inherits from IDisposable, use a using statement
using (OleDbDataReader reader = command.ExecuteReader())
{
// We're now looping through all the rows in the result set
while (reader.Read())
{
UpdateButtonColor(reader["classroom Number"].ToString());
}
}
}
}
}
private void UpdateButtonColor(string classroomNumber)
{
foreach (Button btn in ButtonsPanel.Controls)
{
if (btn.Text == classroomNumber)
{
btn.BackColor = Color.Red;
}
}
}
सी # के नए संस्करणों ने using
कथन को घुंघराले ब्रेस (जो घोंसले को कम करता है) की आवश्यकता नहीं है, जो इस तरह दिखाई देगा:
private void SomeMethod(string day, string time)
{
string query = "SELECT [classroom Number] FROM Table WHERE [Day] = @ParamDay AND [Time] = @ParamTime";
using OleDbConnection connection = new OleDbConnection(connectionString);
using OleDbCommand command = new OleDbCommand(query, connection);
command.Parameters.Add("@ParamDay", day);
command.Parameters.Add("@ParamTime", time);
connection.Open();
using OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
UpdateButtonColor(reader["classroom Number"].ToString());
}
}
इसके लिए प्रलेखन यहाँ पाया जा सकता है