Очень медленное маршалинг полезной нагрузки в 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 делать?

Другие вопросы по тегам