0

Есть ли способ создания структур данных типа «Карта» или «Установить тип» во время компиляции?Статические структуры данных

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

+0

Я не уверен, что это возможно - как создать объект перед запуском приложения?Если данные предварительно вычислены и сохранены в плоском файле (или в каком-либо другом формате сериализации), вы можете загрузить его во время запуска, но я не думаю, что компилятор может * создать * объект структуры данных для вас ... – FrustratedWithFormsDesigner

+0

Там возможно, не будут какие-либо доступные инструменты для этого, но это возможно. Например, его можно создать массив во время компиляции. Если он был отсортирован, то функции компаньона могут использовать его как набор. –

+0

@DutrowLLC: вы могли бы показать пример создания массива во время компиляции? – FrustratedWithFormsDesigner

ответ

3

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

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

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

+0

Да, я не пытался сделать свою жизнь неуверенно трудной, но я не знал, можно ли сделать что-то подобное внутри класса (вместо static {// do stuff}): compiletime {// do stuff} ; ... теперь это было бы легко ... –

+0

Это разумный вопрос, но ответ таков: это практически невозможно. – DJClayworth

2

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

1

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

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

например

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

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

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

1

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

Это, как говорится, можно объявить и инициализировать наборы вместе, как это:

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

Это по-прежнему будет выполняться во время выполнения, хотя.

Чтобы обрабатывать Карты, вам придется использовать статический инициализатор.