Оптимизация производительности winform app - PullRequest
0 голосов
/ 03 мая 2011

Есть ли способ улучшить производительность моего приложения с помощью некоторых утилит? Я пишу приложение на C # с .Net Framework 3.5, и это приложение, которое показывает файлы журналов, которые имеют много строк (это текстовые файлы размером около 200 МБ) и могут иметь оперативную память 500 МБ и загружено около 10 с. Могу ли я снизить производительность? Конечно, это может быть сделано с помощью лучшего кода, но я видел кое-что с NGEN, GAC, ... Может ли это помочь и для моего вида приложений? Спасибо

Редактировать

Пример файла журнала:

110331 052205 4969 [DB] fbba246f-bbe8-43b0-b8ca-f53bb90e8b51 Q   SELECT GRAFIKON.ID,GRAFIKON.NADRAZENYGRAFIKONID,GRAFIKON.PLATNOSTOD,GRAFIKON.PLATNOSTDO,GRAFIKON.OBJEDNAVANIOD,GRAFIKON.OBJEDNAVANIDO,GRAFIKON.NAZEV,GRAFIKON.PROOBJEDNAVANI,GRAFIKON.ARCHIV,GRAFIKON.UZAVREN,GRAFIKON_0.Nazev,GRAFIKON_1.PlatnostOd FROM GRAFIKON LEFT OUTER JOIN GRAFIKON GRAFIKON_0 ON  GRAFIKON.NADRAZENYGRAFIKONID = GRAFIKON_0.Id LEFT OUTER JOIN GRAFIKON GRAFIKON_1 ON  GRAFIKON.NADRAZENYGRAFIKONID = GRAFIKON_1.Id WHERE (GRAFIKON.PROOBJEDNAVANI = 1)

110331 052205 6062 [DB] fbba246f-bbe8-43b0-b8ca-f53bb90e8b51 Q   0s 109ms

110331 052205 6375 [DB] acdbcdb6-aa3a-460a-a323-0be7c4512c14 Q   SELECT NASTAVENI.ID,NASTAVENI.KLIC,NASTAVENI.HODNOTA,NASTAVENI.INFO,NASTAVENI.SKUPINA,NASTAVENI.TEXTAREA FROM NASTAVENI WHERE (NASTAVENI.KLIC = 'ARTICLE_AFTER_OPEN')

110331 052205 6688 [DB] acdbcdb6-aa3a-460a-a323-0be7c4512c14 Q   0s 31ms

110331 052205 7625 [DB] 9fd6ec6b-4844-44fe-8367-26c580ca8493 Q   SELECT NASTAVENI.ID,NASTAVENI.KLIC,NASTAVENI.HODNOTA,NASTAVENI.INFO,NASTAVENI.SKUPINA,NASTAVENI.TEXTAREA FROM NASTAVENI WHERE (NASTAVENI.KLIC = 'GRAPHICON_CLOSED_SMS_TEXT')

110331 052205 7625 [DB] 9fd6ec6b-4844-44fe-8367-26c580ca8493 Q   < 15ms

110331 065945 6813 [DB] 6387c3a4-33a5-4dfd-92d3-f4a8d00c910d Q   SELECT GRAFIKON.ID,GRAFIKON.NADRAZENYGRAFIKONID,GRAFIKON.PLATNOSTOD,GRAFIKON.PLATNOSTDO,GRAFIKON.OBJEDNAVANIOD,GRAFIKON.OBJEDNAVANIDO,GRAFIKON.NAZEV,GRAFIKON.PROOBJEDNAVANI,GRAFIKON.ARCHIV,GRAFIKON.UZAVREN,GRAFIKON_0.Nazev,GRAFIKON_1.PlatnostOd FROM GRAFIKON LEFT OUTER JOIN GRAFIKON GRAFIKON_0 ON  GRAFIKON.NADRAZENYGRAFIKONID = GRAFIKON_0.Id LEFT OUTER JOIN GRAFIKON GRAFIKON_1 ON  GRAFIKON.NADRAZENYGRAFIKONID = GRAFIKON_1.Id WHERE (GRAFIKON.PROOBJEDNAVANI = 1)

110331 065945 7438 [DB] 6387c3a4-33a5-4dfd-92d3-f4a8d00c910d Q   0s 62ms

Первые 12 чисел - это дата и время (затем я могу отбросить мс), затем модуль, информация, Q как запрос, а затем следующая информация или время, сколько требуется для выполнения. И это мой код:

   private Record GetRecordFromString(string strWithRecord)
    {
        Record newRecord = new Record();
        try
        {
            if (strWithRecord.Length < 24)
            {
                newRecord.Prikaz = strWithRecord;
                return newRecord;
            }
            if(!CheckIfFirstCharsAreDateTime(strWithRecord))
            {
                newRecord.Prikaz = strWithRecord;
                return newRecord;
            }

            newRecord.Datum = ChangeDateFormat(strWithRecord.Substring(0, 6));
            newRecord.Cas = ChangeTimeFormat(strWithRecord.Substring(7, 6));
            strWithRecord = strWithRecord.Remove(0, 20);

            int tempInt = strWithRecord.IndexOf(']');
            newRecord.Modul = strWithRecord.Substring(0, tempInt);

            strWithRecord = strWithRecord.Remove(0, tempInt + 2);
            if (newRecord.Modul.StartsWith("DB"))
            {
                if (Char.IsUpper(strWithRecord[0]))
                {
                    newRecord.Informace = strWithRecord;
                }
                else
                {
                    tempInt = strWithRecord.IndexOf(' ');
                    newRecord.Informace = strWithRecord.Substring(0, tempInt);
                    strWithRecord = strWithRecord.Remove(0, tempInt + 1);

                    tempInt = strWithRecord.IndexOf(' ');
                    newRecord.Priznak = strWithRecord.Substring(0, tempInt);
                    strWithRecord = strWithRecord.Remove(0, tempInt + 1);

                    newRecord.Prikaz = strWithRecord;
                }
            }
            else
            {
                newRecord.Informace = strWithRecord;
            }
        }
        catch(Exception e)
        {
            MessageBox.Show(e.Message);
        }
        return newRecord;
    }

private bool CheckIfFirstCharsAreDateTime(string stringToCheck)
{
    if (!Char.IsNumber(stringToCheck[0]) || !Char.IsNumber(stringToCheck[1]) || !Char.IsNumber(stringToCheck[2]) || !Char.IsNumber(stringToCheck[3]) || !Char.IsNumber(stringToCheck[4]) || !Char.IsNumber(stringToCheck[5]) || !Char.IsWhiteSpace(stringToCheck[6]) || !Char.IsNumber(stringToCheck[7]) || !Char.IsNumber(stringToCheck[8]) || !Char.IsNumber(stringToCheck[9]) || !Char.IsNumber(stringToCheck[10]) || !Char.IsNumber(stringToCheck[11]) || !Char.IsNumber(stringToCheck[12]))
    {
        return false;
    }
    return true;

}

private string ChangeDateFormat(string strWithDate)
{
    try
    {
        if (String.IsNullOrEmpty(strWithDate))
            return "";
        char[] arrayOfChars = strWithDate.ToCharArray();
        strWithDate = arrayOfChars[4].ToString() + arrayOfChars[5].ToString() + "." + arrayOfChars[2].ToString() + arrayOfChars[3].ToString() + ".20" + arrayOfChars[0].ToString() + arrayOfChars[1].ToString();
    }
    catch (Exception exp)
    {
        MessageBox.Show(exp.Message);
    }
    return strWithDate;
}

    private string ChangeTimeFormat(string strWithTime)
    {

        if (String.IsNullOrEmpty(strWithTime))
            return "";
        strWithTime = strWithTime.Insert(2, ":");
        strWithTime = strWithTime.Insert(5, ":");

        return strWithTime;
    }

Edit2 Файл профилировщика

Ответы [ 4 ]

1 голос
/ 03 мая 2011

NGEN только помогает производительности JIT;Теперь вы можете попробовать , но, учитывая ваш сценарий, для меня это звучит так, будто вы ограничены производительностью ввода-вывода.Самое простое «исправление», которое я могу предложить: установить более быстрый диск (SSD или что-то в этом роде).

Конечно, вы не показываете, как точно вы читаете файлы;Я бы предложил StreamReader и ReadLine() и только чтение данных, которые вы действительно хотите отобразить .

0 голосов
/ 03 мая 2011

Если вам приходится иметь дело с такими большими наборами данных, вам следует подумать о воспринимаемой производительности .Например, почему бы не выполнить всю работу в фоновом потоке с помощью компонента BackgroundWorker и использовать его событие OnProgress, чтобы сообщить пользователю о его прогрессе.

NGEN и другие трюки приведут вас только далеко (на самом деле не так уж далеко) - вы должны понять, что вам нужен другой подход.

0 голосов
/ 03 мая 2011

Эта статья может быть вам полезна в отношении того, как ускорить загрузку приложения Winforms:

Улучшение времени запуска приложения

Если вы загружаете весь200 МБ текстового файла в память при загрузке, однако я не уверен, насколько это поможет - вы должны попытаться найти способ избежать загрузки больших файлов в память, но то, как вы это сделаете, будет полностью зависеть от того, как работает ваше приложение.

0 голосов
/ 03 мая 2011

Профилировщик Preformance для времени загрузки и профилировщик памяти для использования памяти.

http://www.red -gate.com /

У них есть и инструменты, и бесплатная пробная версия. Больше ничего не скажешь, так как твой вопрос без кода, поэтому отвечай без кода:)

...