2015-08-28 4 views
-1

Мое приложение имеет следующую структуру:Как повысить скорость приложения Java EE

Glassfish как сервер и Java EE 6 структуру (JSF + EJB + JPA).

У меня есть функция, которая включает в себя этот код

public boolean function1(type value) 
{ 
boolean result = false; 

    if() 
    { 
    ....... 
    } 
    else 
    { 
    ......... 
    } 
    return result ; 
} 

public void mainfunction(List<type> Listvalues) 
{ 
for(int i=0;i<Listvalues.size;i++) 
{ 
    Listvalues.get(i).setparametre(function1(Listvalues.g(i))) 
} 
} 

, когда я выполнить mainfunction со списком, который имеет размер> 100000 это занимает 10 минут.

Мой вопрос: если моя конфигурация ноутбука увеличена, это время исполнения уменьшено и на сколько? и какой параметр в конфигурации моего ноутбука нужно изменить и чем? это также зависит от JDK?

моя конфигурация ноутбука: Intel Core i7-2670QM CPU @ 2,20 ГГц (8 CPU) Ram 4 ГБ Windows 7 64bit

ответ

0

Это трудно дать ответ без дальнейших подробностей. Из маленького, что я вижу, могу предложить:

  • Что делает функция1? Он содержит какой-либо цикл, зависящий от значения? Если он линейный по своему параметру (т. Е. Работает примерно в постоянное время), то вы можете повысить производительность за счет перехода на более быстрый процессор. Если программа потребляет память (кэширование и т. Д.), То вы должны попытаться предоставить JVM больше памяти (http://tinyurl.com/8ccrzwo)
  • Откуда берутся Listvalues? Записывает ли он записи базы данных? Если да, то где база данных? Если он работает на вашем ПК, возможно, вы улучшите производительность, обновив процессор и/или предоставив больше памяти серверу БД (или даже изменив максимальные параметры потока). Если он находится на внешнем сервере, на стороне клиента вы можете не много сделать (кроме проверки соединения/полосы пропускания)

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

for (Type item: listValues) 
    item.setParameter (function1 (item)); 

Это позволяет избежать вызывать list.get() дважды (что немного дороже), самое главное, он перебирает список с помощью Collection.iterator() , который, если у вас есть LinkedList, значительно быстрее, чем использование индекса.

Обратите внимание, что я также переименовал ваши переменные и типы в соответствии с соглашениями Java (и грамматикой английского языка).

EDIT: из комментария ниже, я понимаю, я должен был упомянуть об общем вопросе, как оценить производительность программы и как ее можно улучшить? Прежде всего, вы должны приобрести знания об общих алгоритмах и отраслях математики, таких как теория графов или исследования операций. Существует также теория вычислительной сложности, которая позволяет анализировать и оптимизировать алгоритм (http://tinyurl.com/q52zxs2).

+0

Во-первых, спасибо за ответ. Во-вторых, я не писал больше деталей, потому что моя цель - не оптимизировать функцию, а понять, даже если с оптимизированным кодом материал дает разницу во времени исполнения, и если, например, мой размер списка стал огромным, как 1000000000, и мне нужен ответ максимум 10 минут, что я могу сделать? его невозможно сократить время или я нуждаюсь в другом передовом материале может выполнить эту функцию менее чем за 10 минут. – osselosse

+0

См. Дополнение, которое я сделал для своего ответа. Помимо общего случая, это действительно зависит от вашей функции. В общем, программа, работающая с заданной скоростью на данном компьютере, может работать быстрее на более мощном компьютере. Но это не всегда так, например, если оно действительно плохо написано и содержит условия блокировки, или если оно сильно ухудшается (то есть его производительность быстро ухудшается с размером списка), он будет зависать или замедляться даже на самом мощный компьютер во вселенной. – zakmck

0

Запуск более 100 000 объектов в Java даже на медленном процессоре не займет 10 минут. Что вам нужно сделать, так это определить, что в вашем коде вызывает медленность. Это не записи цикла или выражения if/else, которые вы опубликовали. Как предположил zakmck, поиск лучших результатов в базе данных или операций ввода-вывода даст наилучшие результаты.Память и исполнение выполняются быстро, но диски, io и источники данных работают медленно.

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