Оптимизация программ
Я уже довольно давно занимаюсь созданием программ на заказ, но вот оптимизировать их приходится не так уж часто. Нас разбаловали увеличивающиеся мощности компьютеров, со все большей оперативной памятью и ядрами процессора. Однако, иногда все же приходится оптимизировать программу или делать изначально приложение, которое будет работать в ограниченных условиях.
Вот, например, недавний мой проект – создание приложения для фотостудии по приему фото в печать. Программа отлично работает, все в порядке, но вот память есть как не в себя. Потребление возрастает буквально с каждой минутой на десятки мегабайт – а это немало! Почему? Начинаем разбираться.
Признаюсь, первой моей мыслью было установить какие-нибудь жесткие ограничения для приложения на потребляемую оперативную память – и пусть оно там само выкручивается: запускает сборщик мусора, к примеру. Однако, это не очень хороший выход, а совсем даже плохой, так делать нельзя. А как надо делать? Надо оптимизировать код, искать те места, в которых и происходит увеличение потребления ресурсов.
В нашем случае место нашлось быстро: скачок потребления оперативной памяти происходил при перелистывании страниц с изображениями. За это отвечает метод 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.