Статические структуры данных - PullRequest
0 голосов
/ 02 ноября 2010

Есть ли способ создать структуры данных типа Map или Set во время компиляции?

Причина, по которой я спрашиваю это, заключается в том, что я работаю с App Engine, и у меня есть некоторые структуры данных, которые необходимо отсортировать и найти, но они постоянны, поэтому я бы хотел избежать затрат времени на их создание при запуске.

Ответы [ 4 ]

3 голосов
/ 02 ноября 2010

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

Предполагая, что вы это сделали, давайте посмотрим на варианты.Сколько времени вы действительно можете сэкономить?Лучше всего использовать некоторую форму сериализации , но вам придется написать это самостоятельно;даже если вы определите формат файла для хранения содержимого, файл нужно будет проанализировать, а структуры данных в памяти должны быть созданы.Это займет время, и вряд ли это будет значительно быстрее, чем просто создать Карты или Наборы и заполнить их.В некоторых языках вы можете теоретически сохранить битовую комбинацию памяти для этих структур, но даже если вы можете это сделать, вы становитесь уязвимыми к любым небольшим изменениям в версии компилятора, и любые ошибки, которые вы делаете, будут практически невозможны для отладки.

Короче, не делайте этого, если вы не уверены, что вам нужно.Даже тогда вы, вероятно, не должны этого делать.Единственное время, которое вам следует сделать, - это если (возможно, очень небольшая) экономия времени будет абсолютно означать разницу между успехом и провалом вашего проекта.

2 голосов
/ 02 ноября 2010

Если вы используете Spring, вы можете создавать и заполнять эти структуры данных в конфигурации и кэшировать их, но я не понимаю, как можно избежать их создания и заполнения во время выполнения.Вы должны запустить этот код когда-нибудь.Для меня это звучит как преждевременная оптимизация.

1 голос
/ 02 ноября 2010

Нет;создание ВСЕХ ваших объектов всегда происходит во время выполнения.

При этом вы можете объявлять и инициализировать наборы вместе следующим образом:

private static Set<String> set = new HashSet<String>(Arrays.asList("abc", "def"));

Это все равно будет выполнено во время выполнения.

Для обработки Карт вы 'вместо этого я должен использовать статический инициализатор.

1 голос
/ 02 ноября 2010

Во время компиляции я не думаю, что это возможно.Во время выполнения это возможно.Лучшее решение - использовать движок приложения и, возможно, использовать трюк cron для поддержания его в горячем состоянии ссылка на задание cron

Затем вы можете определить список в статическом блоке кода, который будет кешироваться.при первом запуске приложения

например,

private static List<Object> list = new ArrayList<Object>();

static {
    for(Value value : getValues()){
        list.add(value);
    }
}

Также см. весенние аннотации для пост-конструкции, так что вы можете сделать то же самое, но в нестатической среде, пометивметод с @PostConstruct, который будет выполняться при создании вашего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...