loopbackio / loopbackio/loopback-next

Performance issues with ModelUtils._coerce and coerceArray

未关闭
#9,501 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

bug
主要语言
TypeScript
星标
5.1k
派生
1.1k
平均合并
2 天 21 小时
30 天内合并 PR
27

描述

Describe the bug

The way ModelUtils._coerce uses coerceArray is inefficient, and is causing it to show up as 20% of my application's CPU usage in profiler runs under a create heavy workload.

The problem code is this in juggler:

    try {
      // Coerce val into an array if it resembles an array-like object
      val = coerceArray(val);
    } catch (e) {
      // NOOP when not coercable into an array.
    }

Throwing and catching an error is much more expensive than returning a value, and nearly every call to _coerce hits this try/throw/catch path.

image

A variant of coerceArray that doesn't throw, but instead returns [arrayVal | undefined, coerced: boolean] I think would fix the performance problem here.

Logs

No response

Additional information

No response

Reproduction

design issue

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 lib/model-utils.js 的第 498-503 行附近开始,这里 ModelUtils._coerce 会在 try/catch 路径中调用 coerceArray。检查 coerceArray 的行为以及 issue 中描述的 create-heavy 工作负载,然后验证 coercion 在没有重复异常开销的情况下仍能保持现有行为,并通过 profiling 确认改进效果。

由索引模型根据 Issue 内容生成。

评估

技术栈
javascript
领域
backend, performance
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。