WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Повышение скорости выполнения программ

Повышение скорости выполнения программ


Дата публикации: 17-03-2013

Первое впечатление о вашей программе у пользователя складывается именно на основании скорости работы вашей программы. Так ваша программа может иметь производящий глубокое впечатление пользовательский интерфейс, но если он заставляет ждать вечность, то шансов, что пользователи полюбят программу не велики. И вы это знаете, потому что бывали в такой ситуации и испытывали те же самые чувства. Итак, что должно быть сделано для повышения скорости Java приложения или апплета? Ну, я не знаю ни одного решения "серебряной пули". Однако, вы можете последовать нескольким простым руководящим принципам, которые могут помочь повысить скорость ваших программ.

Я глубоко убежден, что большинство проблем могут быть разрешены, если мы разберемся в них. Поэтому, давайте выявим различные фазы работы программы, для того, что бы увидеть, где именно мы можем повысить скорость работы, а затем мы поговорим о том, как мы можем поднять скорость. Типичный жизненный цикл программы:

1. Программа загружается (инициализация).
2. Запуск программы (выполнение).
3. Выход из программы (завершение).

Помимо этого, я могу заметить, что первые два этапа жизни программы являются наиболее пунктами, где вы должны попытаться повысить скорость работы. Если вы в состоянии, то позаботьтесь и о последнем этапе. Поскольку обычно не так утомительно и скучно смотреть на надпись типа "System is shutting down, please wait ...". Теперь давайте разберемся, как мы можем повысить скорость выполнения во время инициализации и выполнения.

Давайте начнем в первую очередь с инициализации. Множество программ пытаются инициализировать все возможные вещи в начале запуска. Если для вашей программы не имеет значения, то попытайтесь отложить времяпоглащающие этапы инициализации. Под отложенной инициализацией я понимаю минимизацию инициализации в начале работы программы. Такой подход в действительности придаст вашей программе больше скорости. Вы, вероятно, думаете, как же я провожу инициализацию? Хороший вопрос! Один из путей, который я могу предложить, заключается в использовании концепции just in time - выборка данных только тогда, когда они потребуются и сохранение их для дальнейшего использования, что бы не пришлось осуществлять новую их выборку. Теперь давайте посмотрим способ кэширования данных на примере:



import java.util.Hashtable;
import java.util.Vector;

/** The data manager - supplies data. */
public class DataManager {

/** Hashtable to cache objects. */
private static Hashtable cache;

/** Initialize. */
public static void init() {
// Initialize quickly
cache = new Hashtable();
}

/** Returns the data for the supplied key. */
protected static Vector getData(String key) {
// This code returns dummy data
Vector v = new Vector();
if (key.equals("1")) {
v.addElement(new String("One"));
}
return v;
}

/** Fetches data given the key. */
public static Vector fetchData(String key) {
// Check if data exists in the cache
Vector v = (Vector)cache.get(key);
if (v == null) {
// Data not found in cache, get it
System.out.println("Key " + key + " not found in cache.");
v = getData(key);
// Cache it now
cache.put(key, v);
}
else {
System.out.println("Key " + key + " found in cache.");
}
return v;
}

/** Main. */
public static void main(String[] args) {
// Initialize
DataManager.init();
// First call, data not in cache
Vector v = DataManager.fetchData("1");
// Second call, data in cache
v = DataManager.fetchData("1");
}

}
Класс DataManager предоставляет данные приложению через ключ. Ключ здесь это String, а данные возвращаются в виде вектора (Vector) из строк (String). Первая вещь, которую выполняет метод main() - инициализация DataManager. Метод init() просто создает хеш-таблицу. Первый вызов метода fetchData() в действительности осуществляет выборку данных и сохраняет (кэширует) их. Все последующие вызовы fetchData() с этим же ключем вернут данные уже из кэша. Поэтому инициализация данных откладывается до тех пор, пока эти данные в действительности не понадобятся. Как только мы проинициализировали какие-то данные, то все последующие обращения к ним будут брать данные из кэша и при этом не будет торможений. В этом примере мы имеем вызов методов выборки из метода main(). Но ваша программа может осуществлять эти вызовы из любых других мест, например, из кода пользовательского интерфейса. Только здесь нужно быть осторожным, поскольку те данные, которые помещаются в кэш, могут занимать очень много памяти.

С инициализацией, в общем-то все. Пришло время обсудить, как мы можем повысить скорость во время исполнения программы. Ниже помещен список нескольких общих вещей, которые могут повысить скорость исполнения вашей программы:

1. Создавайте минимум объектов. Как вы знаете, Java использует сборщик мусора для удаления объектов. Сборщик мусора работает с самым низким приоритетом и он не всегда может обеспечить вам шанс получить свободную память. Когда есть возможность, используйте уже существующие объекты, вместо создания новых. Такой подход так же известен, как "пул объектов".
2. Если ваша программа активно использует ввод/вывод, попытайтесь использовать ввод/вывод большими объемами данных, вместо чтения байта за байтом.
3. Если вы используете множество строк, используйте StringBuffer вместо String. Именно по этому у нас есть StringBuffer.
4. Если нужно скопировать массив, то используйте System.arraycopy() вместо обычного цикла перебора всех элементов массива.
5. Классы типа Vector, Hashtable и StringBuffer выделяют память блоками, по мере необходимости. Например, когда вы скажите new Vector(); в вашей программе, в действительности зарезервируется память для 10 объектов (обычно для 10). Если вы знаете, с каким количество объектов вы будете иметь дело, то в конструкторе вектора можно сразу указать их количество. Тем самым память израсходуется более экономно. Например, если вы знаете, что вам понадобится примерно 50 элементов в векторе - используйте new Vector(50);. В случае, если вам не нужны все эти элементы сразу и за раз, попытайтесь подобрать наиболее подходящую вместимость для вектора (если это возможно).
6. Если ваша программа осуществляет интенсивные сетевые операции, попытайтесь минимизировать трафик. Например, вместо посылки полной комманды "Hello World!", просто пошлите опкод типа "H" и уже интерпретируйте его на другом конце. По мере того, как объемы данных будут нарастать вы можете сжимать их до посылки, отсылать и расжимать их после приема.

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

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

К. Гепперт и К. Пат:

"Центральный банк — это банк, при помощи которого государство вмешивается в дела частных банков и который, в отличие от них, может сам печатать нужные ему деньги."

Опрос

Ваша ОС?

Windows XP
Windows 7
др. версия Windows
Linux
др. ОС