2013-10-07 3 views
2

У меня есть коллекция от одного до 100 объектов определенного типа. Эти объекты имеют более 100 атрибутов. Я должен пересекать все объекты в коллекции и проверять определенные действия, чтобы что-то с ними делать. Фактические методы зависят от файла свойств, поэтому я не могу заранее знать, какой из них мне нужно вызвать. Я сделал это с отражением таким образом:Показатель отражения

for (MyObject mo : myObjectList){ 

    for (PropertyDescriptor propertyDescriptor : Introspector 
         .getBeanInfo(mo.getClass()) 
         .getPropertyDescriptors()) { 

     method = propertyDescriptor.getWriteMethod(); 

     if (method != null){ 
      //Here I check if the attribute is in the properties file and do the job 
     } 

    } 
} 

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

Метод отражения является дорогостоящим компьютером, но это единственный способ, которым я смог выполнить задачу без изменения кода, если завтра будет задан новый атрибут задачи.

Я прочитал (не помню источник), что самая дорогая часть рефлекса ищет методы больше, чем называть их, поэтому я думал, что, возможно, меняет петли (т. Е. Ищет методы, а затем вызывает метод путем отражения для каждого объекта) - это изменение производительности. Что-то вроде этого:

for (PropertyDescriptor propertyDescriptor : Introspector 
         .getBeanInfo(MyObject.getClass()) 
         .getPropertyDescriptors()) { 

    if (method != null){ 
     for (MyObject mo : myObjectList){ 
     //Do the job here 
     } 
    } 

} 

Есть ли основания для поворота петель?

+0

Обратите внимание, что экземпляры 'Method' и' Field' обычно кэшируются, поэтому только первый поиск дорог. –

ответ

2

У вас на самом деле измеряется исполнение этого? Я подозреваю, что это воздействие незначительно по сравнению с сетью и накладные расходы на ваш веб-сервис.

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

+0

После тестирования я думаю, что вы правы. Изменение порядка циклов имеет минимальное влияние в времени отклика webservice. По-видимому, в результате теста, что обратные циклы немного более эффективны во времени в худшем случае, но времена очень похожи, и необходимо провести более глубокий тест, чтобы проверить его. Благодаря :) – Averroes

Смежные вопросы