Question

J'ai un netbook avec processeur 1.20GHz et 1 Go de RAM.

Je suis en cours d'exécution d'un C # WinForms application sur ce qui, à 5 minutes d'intervalle, lit chaque ligne d'un fichier texte et en fonction de ce que le contenu de cette ligne est, que ce soit ce qu'il saute ou écrit dans un fichier xml. Parfois, il peut être en train de traiter environ 2000 lignes.

Quand il commence cette tâche, le processeur se maximisé, l'utilisation de 100%. Cependant sur mon bureau avec processeur 2,40 GHz et 3 Go de RAM, il est intact (pour des raisons évidentes) ... est-il possible que je peux effectivement réduire ce problème de processeur de façon spectaculaire? Le code n'est pas complexe, je ne suis pas mal du codage soit et je suis pas constamment ouvrir le fichier, la lecture et l'écriture ... tout se fait en une seule fois.

Toute aide grandement appréciée!

Exemple de code

*** minuterie .....

#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);
        }
Était-ce utile?

La solution

Utilisez un profileur et / ou Analyseur de performances et / ou \\live.sysinternals.com\tools\procmon.exe et / ou ResourceMonitor pour déterminer ce qui se passe

Autres conseils

Si le processus de 5 minutes est une tâche d'arrière-plan, vous pouvez utiliser la priorité de cette discussion.

.

Si vous faites le traitement sur un thread séparé, changer votre minuterie pour un System.Threading.Timer et utiliser des événements de rappel, vous devriez être en mesure de définir une priorité plus faible sur ce fil que le reste de votre application.

Dans votre boucle parseFile, vous pouvez essayer d'ajouter un Thread.Sleep et / ou Application.DoEvents () appeler pour voir si cela aide. Il est préférable de le faire dans l'analyse syntaxique est sur un fil séparé, mais au moins vous pouvez essayer ce simple test pour voir si elle aide.

Peut-être que les MessageBoxes dans vos prises sont en cours d'exécution dans les problèmes inter-threads. Essayez-les échanger pour écrire à la sortie de trace.

Dans tous les cas, vous avez posté un ensemble (petit) programme, qui ne sera pas vous aider à obtenir des conseils spécifiques. Essayez supprimer corps de méthode - un à la fois, scientifiquement - et essayer d'obtenir le problème de se produire / arrêt se produit. Cela vous aidera à localiser le problème et d'éliminer les parties non pertinentes de votre question (à la fois pour vous et pour le SO).

Votre modèle de traitement actuel est basé lot - faire l'analyse syntaxique, puis de traiter les messages, etc.

.

Vous réduirez probablement la surcharge de la mémoire si vous avez changé d'une approche de style Linq « pull ».

Par exemple, vous pouvez convertir votre méthode de ParseFile() de cette façon:

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;
        }
    }
}

L'avantage est que chaque SmsMessage peut être traité comme il est généré, au lieu d'analyser tous les messages à la fois et la manipulation puis tous.

Cela réduit vos frais généraux de mémoire, qui est l'une des causes les plus probables de la différence de performance entre votre netbook et votre bureau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top