【问题标题】:very slow marshaling a payload in Groovy在 Groovy 中编组有效负载非常慢
【发布时间】:2018-03-23 10:25:49
【问题描述】:

我目前正在开发一个 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>

我有大约 9000 个步骤,需要大约 150000 毫秒来执行 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
}

【问题讨论】:

    标签: angularjs hibernate groovy sessionfactory batch-fetching


    【解决方案1】:

    好的,完全猜测,但你可以尝试替换:

    def payload = []
    
    steps.each {
        payload << marshalMinimalStep(it)
    }
    

    def payload = steps.collect { marshalMinimalStep(it) }
    

    看看会不会更快?

    可能不是?marshalTranslation 是做什么的?

    【讨论】:

    • marshalTranslation() 是获取多语言中步骤名称的所有翻译(我们目前有 6 种语言)我刚刚尝试了您的建议。日志说它需要几乎一半的时间,就像我以前做的那样。但要完全渲染出来,我现在需要 2 倍的时间。
    • 请原谅。我的错。我读错了日志。它仍然需要像以前一样的时间。
    • 我猜是marshallTranslation 花了点时间……你能分享一下吗?
    • 我更新了问题并将 marshalTranslation() 放在那里。
    • 看不出为什么会很慢...这使我们回到User.findAllByUserName是罪魁祸首...您可以在代码中输入一些日志记录以验证是这一行需要很久了吗?
    猜你喜欢
    • 2017-12-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多