سؤال

لدي نتبووك مع معالج 1.20 جيجا هرتز وذاكرة الوصول العشوائي 1GB.

أنا أقوم بتشغيل تطبيق C # WinForms عليه، على فترات زمنية 5 دقائق، يقرأ كل سطر من ملف نصي واعتمادا على ما هو محتوى هذا السطر هو، إما يتخطىه أو يكتبه إلى ملف XML. في بعض الأحيان قد يتم معالجة حوالي 2000 خطوط.

عندما يبدأ هذه المهمة، يحصل المعالج على الحد الأقصى، واستخدام 100٪. ومع ذلك، على سطح المكتب الخاص بي مع معالج 2.40 جيجا هرتز وذاكرة الوصول العشوائي 3GB، فإنه لم يمس (لأسباب واضحة) ... هل هناك أي طريقة يمكنني فعلا تقليل إصدار المعالج هذا بشكل كبير؟ الكود ليس معقدا، أنا لست سيئا في الترميز أيضا وأنا لا أفتح الملف، والقراءة والكتابة ... كل ذلك يتم ذلك في ضربة واحدة.

أي مساعدة في تقدير كبير!؟

عينة من الرموز

*** الموقت .....

#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);
        }
هل كانت مفيدة؟

المحلول

استخدم منشآت Profiler و / أو مراقب الأداء و / أو \\live.sysinternals.com\tools\procmon.exe و / أو الموارد لتحديد ما يجري

نصائح أخرى

إذا كانت عملية 5 دقائق مهمة خلفية، فيمكنك الاستفادة من أولوية مؤشر الترابط.

MSDN. هنا.

إذا قمت بالمعالجة في مؤشر ترابط منفصل، فقم بتغيير المؤقت الخاص بك لتكون نظام ..Threading.timer واستخدام أحداث الاتصال، يجب أن تكون قادرا على تحديد أولوية أقل في هذا الموضوع أكثر من بقية طلبك.

داخل حلقة ParseFile، يمكنك محاولة إضافة خيط و / أو Application.DoEvents () اتصل لمعرفة ما إذا كان ذلك يساعد. من الأفضل القيام بذلك في التحليل موجود على مؤشر ترابط منفصل، ولكن على الأقل يمكنك تجربة هذا الاختبار البسيط لمعرفة ما إذا كان ذلك يساعد.

قد يكون ذلك أن صناديق الرسائل في المصيد الخاص بك تعمل في مشاكل عبر مؤشر الترابط. حاول تبديلها للكتابة إلى إخراج التتبع.

على أي حال، قمت بنشر برنامج كامل (قليل)، والذي لن يساعدك في الحصول على نصيحة محددة. يحاول حذف هيئات الطريقة - واحدة في وقت واحد، علميا - ومحاولة الحصول على المشكلة تحدث / توقف حدوثها. سيساعدك ذلك في تحديد موقع المشكلة والقضاء على الأجزاء غير ذات الصلة من سؤالك (من أجل نفسك ولهذا).

نموذج المعالجة الحالي الخاص بك هو الدفعة القائمة - قم بالتحليل، ثم معالجة الرسائل، وهلم جرا.

من المحتمل أن تقلل من النفقات العامة للذاكرة إذا تحولت إلى نهج "سحب" نمط LinQ.

على سبيل المثال، يمكنك تحويل الخاص بك ParseFile() الطريقة بهذه الطريقة:

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

الميزة هي أنه يمكن معالجة كل SMSmessage لأنه يتم إنشاؤه، بدلا من تحليل جميع الرسائل مرة واحدة ثم التعامل معها جميعا.

يؤدي هذا إلى خفض النفقات العامة للذاكرة، وهو أحد الأسباب الأكثر احتمالا لفرق الأداء بين نتبووك الخاص بك وسطح المكتب الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top