Frage

Ich habe ein Netbook mit 1.20GHz Prozessor und 1 GB RAM.

Ich bin mit einer C # WinForms-Anwendung auf sie, die in Intervallen von 5 Minuten, jede Zeile einer Textdatei liest und je nachdem, was der Inhalt dieser Linie ist, entweder übersprungen oder schreibt sie in eine XML-Datei. Manchmal kann es Verarbeitung von etwa 2000 Zeilen werden.

Wenn es diese Aufgabe beginnt, wird der Prozessor ausgereizt, 100% Einsatz. Doch auf meinem Desktop mit 2.40GHz Prozessor und 3 GB Ram es unberührt ist (aus offensichtlichen Gründen) ... ist es eine Möglichkeit, dramatisch diesen Prozessor Problem tatsächlich reduzieren kann? Der Code ist nicht komplex, ich Codierung auch nicht schlecht und ich bin nicht ständig die Datei zu öffnen, zu lesen und zu schreiben ... alles auf einem Schlag getan hat.

Jede Hilfe sehr geschätzt!?

Beispielcode

*** Timer .....

#region Timers Setup

            aTimer.Tick += new EventHandler(OnTimedEvent);
            aTimer.Interval = 60000;
            aTimer.Enabled = true;
            aTimer.Start();
            radioButton60Mins.Checked = true;

            #endregion Timers Setup


private void OnTimedEvent(object source, EventArgs e)
        {
            string msgLoggerMessage = "Checking For New Messages " + DateTime.Now;
            listBoxActivityLog.Items.Add(msgLoggerMessage);
            MessageLogger messageLogger = new MessageLogger();
            messageLogger.LogMessage(msgLoggerMessage);

            if (radioButton1Min.Checked)
            {
                aTimer.Interval = 60000;
            }
            if (radioButton60Mins.Checked)
            {
                aTimer.Interval = 3600000;
            }
            if (radioButton5Mins.Checked)
            {
                aTimer.Interval = 300000;
            }

            // split the file into a list of sms messages
            List<SmsMessage> messages = smsPar.ParseFile(smsPar.CopyFile());

            // sanitize the list to get rid of stuff we don't want
            smsPar.SanitizeSmsMessageList(messages);

            ApplyAppropriateColoursToRecSMSListinDGV();
        }

public List<SmsMessage> ParseFile(string filePath)
        {
            List<SmsMessage> list = new List<SmsMessage>();
            using (StreamReader file = new StreamReader(filePath))
            {
                string line;
                while ((line = file.ReadLine()) != null)
                {
                    var sms = ParseLine(line);
                    list.Add(sms);
                }
            }
            return list;
        }

        public SmsMessage ParseLine(string line)
        {
            string[] words = line.Split(',');

            for (int i = 0; i < words.Length; i++)
            {

                words[i] = words[i].Trim('"');
            }
            SmsMessage msg = new SmsMessage();
            msg.Number = int.Parse(words[0]);
            msg.MobNumber = words[1];
            msg.Message = words[4];
            msg.FollowedUp = "Unassigned";
            msg.Outcome = string.Empty;

            try
            {

                //DateTime Conversion!!!
                string[] splitWords = words[2].Split('/');
                string year = splitWords[0].Replace("09", "20" + splitWords[0]);
                string dateString = splitWords[2] + "/" + splitWords[1] + "/" + year;
                string timeString = words[3];
                string wholeDT = dateString + " " + timeString;
                DateTime dateTime = DateTime.Parse(wholeDT);
                msg.Date = dateTime;

            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                Application.Exit();
            }
            return msg;
        }

        public void SanitizeSmsMessageList(List<SmsMessage> list)
        {
            // strip out unwanted messages
            // list.Remove(some_message); etc...
            List<SmsMessage> remove = new List<SmsMessage>();
            foreach (SmsMessage message in list)
            {
                if (message.Number > 1)
                {
                    remove.Add(message);
                }
            }
            foreach (SmsMessage msg in remove)
            {
                list.Remove(msg);
            }
            //Fire Received messages to xml doc
            ParseSmsToXMLDB(list);
}

public void ParseSmsToXMLDB(List<SmsMessage> list)
        {
            try
            {
                if (File.Exists(WriteDirectory + SaveName))
                {
                    xmlE.AddXMLElement(list, WriteDirectory + SaveName);
                }
                else
                {
                    xmlE.CreateNewXML(WriteDirectory + SaveName);
                    xmlE.AddXMLElement(list, WriteDirectory + SaveName);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                Application.Exit();
            }
        }

public void CreateNewXML(string writeDir)
        {
            try
            {
                XElement Database = new XElement("Database");
                Database.Save(writeDir);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

        public void AddXMLElement(List<SmsMessage> messages, string writeDir)
        {
            try
            {
                XElement Database = XElement.Load(writeDir);
                foreach (SmsMessage msg in messages)
                {
                    if (!DoesExist(msg.MobNumber, writeDir))
                    {
                        Database.Add(new XElement("SMS",
                              new XElement("Number", msg.MobNumber),
                              new XElement("DateTime", msg.Date),
                              new XElement("Message", msg.Message),
                              new XElement("FollowedUpBy", msg.FollowedUp),
                              new XElement("Outcome", msg.Outcome),
                        new XElement("Quantity", msg.Quantity),
                        new XElement("Points", msg.Points)));

                        EventNotify.SendNotification("A New Message Has Arrived!", msg.MobNumber);

                    }
                }
                Database.Save(writeDir);
                EventNotify.UpdateDataGridView();
                EventNotify.UpdateStatisticsDB();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

public bool DoesExist(string number, string writeDir)
        {
            XElement main = XElement.Load(writeDir);
            return main.Descendants("Number")
                      .Any(element => element.Value == number);
        }
War es hilfreich?

Lösung

Verwenden Sie einen Profiler und / oder Performance Monitor und / oder \\live.sysinternals.com\tools\procmon.exe und / oder ResourceMonitor zu bestimmen, was auf

los

Andere Tipps

Wenn der 5 Minuten Prozess eine Hintergrundaufgabe ist, können Sie die Verwendung von Threadpriorität machen.

hier .

Wenn Sie die Verarbeitung auf einem separaten Thread zu tun, ändern Sie Ihre Timer ein System.Threading.Timer zu sein und Callback-Ereignisse zu verwenden, sollten Sie in der Lage sein, eine niedrigere Priorität auf diesem Thread zu setzen als der Rest der Anwendung.

In Ihrer ParseFile Schleife, könnten Sie versuchen, eine Thread.Sleep und / oder ein Application.DoEvents () anrufen, um zu sehen, ob das hilft. Es ist besser, dies zu tun in der Analyse auf einem separaten Thread, aber zumindest können Sie diesen einfachen Test zu sehen, ob es hilft.

Könnte sein, dass die Message in Ihrer Fänge laufen in Cross-Thread-Probleme. Versuchen Sie tauschen sie aus zum Schreiben in die Trace-Ausgabe.

In jedem Fall haben Sie ein ganzes (wenig) Programm geschrieben, mit dem Sie spezifische Beratung erhalten nicht helfen. Versuchen Sie Löschen Methodenrümpfe - einer nach dem anderen, wissenschaftlich - und versuchen, das Problem zu bekommen auftreten / Stopp auftritt. Dies wird Ihnen helfen, das Problem zu lokalisieren und die irrelevanten Teile Ihrer Frage (beide für sich selbst und für SO) zu beseitigen.

Ihr aktuelles Verarbeitungsmodell wird Batch-Basis - tut das Parsen, verarbeitet dann die Nachrichten, und so weiter

.

Sie werden wahrscheinlich den Speicher-Overhead reduzieren, wenn Sie auf eine Linq-Stil „Pull“ -Ansatz geschaltet.

Zum Beispiel könnten Sie Ihre ParseFile() Methode auf diese Weise konvertieren:

public IEnmerable<SmsMessage> ParseFile(string filePath)
{
    using (StreamReader file = new StreamReader(filePath))
    {
        string line;
        while ((line = file.ReadLine()) != null)
        {
            var sms = ParseLine(line);
            yield return sms;
        }
    }
}

Der Vorteil ist, dass jede SmsMessage gehandhabt werden kann, wie es erzeugt wird, statt alle Nachrichten auf einmal Parsen und dann alle Umgangs mit ihnen.

Das senkt Ihre Speicher-Overhead, die zwischen Ihrem Netbook und Desktop.

eine der wahrscheinlichsten Ursachen für den Performance-Unterschied ist
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top