Оптимизация программ


Я уже довольно давно занимаюсь созданием программ на заказ, но вот оптимизировать их приходится не так уж часто. Нас разбаловали увеличивающиеся мощности компьютеров, со все большей оперативной памятью и ядрами процессора. Однако, иногда все же приходится оптимизировать программу или делать изначально приложение, которое будет работать в ограниченных условиях.

Вот, например, недавний мой проект – создание приложения для фотостудии по приему фото в печать. Программа отлично работает, все в порядке, но вот память есть как не в себя. Потребление возрастает буквально с каждой минутой на десятки мегабайт – а это немало! Почему? Начинаем разбираться.



Признаюсь, первой моей мыслью было установить какие-нибудь жесткие ограничения для приложения на потребляемую оперативную память – и пусть оно там само выкручивается: запускает сборщик мусора, к примеру. Однако, это не очень хороший выход, а совсем даже плохой, так делать нельзя. А как надо делать? Надо оптимизировать код, искать те места, в которых и происходит увеличение потребления ресурсов.

В нашем случае место нашлось быстро: скачок потребления оперативной памяти происходил при перелистывании страниц с изображениями. За это отвечает метод button1_Click:

      private void button1_Click(object sender, EventArgs e)
        {
            for (int i = indikator; i < indikator + 6; i++) {
                if (i < chislo_files)
                {
                    lb[i].Visible = false;
                    pb[i].Visible = false;
                     for (int j = 0; j < сhislo_format_bumagi; j++)
                    {
                    nd[i, j].Visible = false;
                    metk[i, j].Visible = false;
                     }
                }
            }
            indikator = indikator + 6;
            if (indikator >= chislo_files) indikator = 0;
            for (int i = indikator; i < indikator + 6; i++)
            {
                if (i < chislo_files)
                {
                    CopyFiles(folder, Path2Folder(temp_folder), i);
                    Bitmap image1 = new Bitmap(temp_folder + "\\" + mass[i]);
                    pb[i].Image = image1;
                    lb[i].Visible = true;
                    pb[i].Visible = true;
                    for (int j = 0; j < сhislo_format_bumagi; j++)
                    {
                        nd[i, j].Visible = true;
                        metk[i, j].Visible = true;
                    }
                }
            }
            label3.Text = (indikator/6 +1).ToString();
        }
Очевидно, что потребление памяти происходит в этих строках:

Bitmap image1 = new Bitmap(temp_folder + "\\" + mass[i]);
pb[i].Image = image1;
Но от этого нам никак не избавиться – изображения надо выводить. Логично предположить, что можно уничтожить предыдущие – они же нам все равно не нужны. Сказано – сделано. Добавляем строку в предыдущий цикл:

pb[i].Image.Dispose();
И – вуаля – приложение ест только 20-30 Мб всегда, независимо от того, листаем мы страницы или нет.



Итак, если вам надо создать программу на заказ или оптимизировать уже имеющуюся – обращайтесь. При наличии четкого или не очень ТЗ в первом случае и исходного кода во втором - вам с удовольствием помогу. У меня опыт работы создания приложений не только для студентов (курсовые и дипломные), но и программ, которые задействованы в повседневной работе. В основном это многочисленные помощники, различные парсеры и грабберы или программы по расчету значений позволяющие избавить вас от рутинной работы.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, создание программ, си шарп, оптимизация, утечки памяти




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Овсяное печенье
Урок 24. ArrayList Java
Протоколы TCP/IP