Очень медленное маршалинг полезной нагрузки в Groovy
В настоящее время я занимаюсь разработкой приложения Angular/Groovy и у меня очень низкая производительность за счет маршалинга полезной нагрузки в бэкэнде (groovy). Требуется очень много времени, чтобы закончить, отправить его во внешний интерфейс и выполнить рендеринг.
В бэкэнде у меня есть:
def getAll(String userName) {
def payload = marshalSteps(Step.findAllByUserName(userName))
if (payload.size() <= 0) {
payload = NO_STEPS
}
payload
}
marshalSteps выглядит так:
private static def marshalSteps(List<Step> steps) {
def payload = []
steps.each {
payload << marshalMinimalStep(it)
}
payload
}
Поскольку мы отправляем различные маршалинг для каждого запроса, marshalMinimalStep выглядит следующим образом:
private static def marshalMinimalStep(Step step) {
def payload = [
id : step.id,
name : step.name,
names : marshalTranslation(step.names),
shortcut : step.shortcut,
week : step.week.doubleValue(),
isRelevant : step.isRelevant
]
payload
}
В веб-интерфейсе я использую ng-repeat для отображения всех шагов.
<ul class="list-group" ng-show="stepCtrl.steps.length > 0">
<div ng-repeat="step in stepCtrl.steps | orderBy:'name' track by step.id">
<div class="col-md-10">
<li class="list-group-item overview" ng-click="stepCtrl.edit(step.id)">
<display-name translations="step.names"></display-name>
<span class="pull-right">{{step.week}}</span>
</li>
</div>
</div>
</ul>
У меня около 9 000 шагов и мне нужно около 150 000 мс для выполнения этого метода getAll() и рендеринга шагов во внешнем интерфейсе, что слишком медленно.
Что я могу сделать, чтобы улучшить производительность?
Нужно ли выполнять массовую выборку в Hibernate, как sessionFactory.currentSession.clear()?
Я поставил также marshalTranslation() как часть вопроса.
private static def marshalTranslation(List<Translation> translations) {
def payload = []
translations.each {
payload << [
language: it.language,
content : it.content
]
}
payload
}
1 ответ
Хорошо, общее предположение, но вы можете попробовать заменить:
def payload = []
steps.each {
payload << marshalMinimalStep(it)
}
С
def payload = steps.collect { marshalMinimalStep(it) }
И посмотри, быстрее ли?
Наверное, не то, что делает marshalTranslation
делать?