2024 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面了解有关本站工作方式的更多信息。

0
ClojureScript
在生成源映射时,我们发出大量不必要的额外数据,这些数据对于映射堆栈跟踪是没有用的。

Planck 在仍然能够成功映射堆栈跟踪的同时,裁剪掉大量信息,大幅提升性能:Planck 立即加载较小的源映射文件,而不是几秒钟。这一做法已经实施一年,没有接到任何问题的报告。

我认为我们可能也能在 ClojureScript 中做到同样的效果,当我们写入源映射时。进行一次实验很有价值,该实验通过之前为 Planck 开发的函数,可选地移除这些信息。


(defn- strip-source-map
  "将源映射简化到映射堆栈跟踪所需的最小表示形式"
  堆栈跟踪。这意味着我们只需要 :line 和 :col 字段,我们只需要
  每个此类映射向量中的最后一个元素,并可以消除
  重复项,为每个唯一值取最小的 col 编号。"
  [sm]
  (into {}
    (map (fn [[row cols]]
           [row (->> cols
                         [col [(select-keys (peek frames) [:line :col])]]))
                  (sort-by first)
                  (distinct-by second)
                  (into {}))]))
    sm))
    请求

0
评论者:mfikes

我们目前正在为每个抽象语法树(AST)发出源映射行/列信息,无论操作类型。

这确保了我们具有全面的源映射信息,但对于许多常见用途来说,这可能是我们所需数量的很多。

某些操作类型可以被清楚地省略,例如例如{{:no-op}}。通过一点实验,您可以了解到仅使用两种或三种操作类型即可用于映射堆栈跟踪的源映射。

此附件中的补丁限制了源映射行/列的排放,只针对需要堆栈跟踪映射的标签以及Dirac(Dirac是堆栈跟踪映射所需标签的子集)的一些简单用途。这种策略的根本问题在于识别需要我们发出行/列信息的操作符的正确子集。

但是,如果我们能够成功识别出一个满足普遍需求的最小集合,这可能就值得了。使用此补丁,在编译Coal Mine并启用非并行模式时,相对当前主分支,我们获得了12%的性能提升。

使用此补丁,写入磁盘的源映射大小更小:对于{{cljs.core}},它变为432567字节,而不是640411字节。

附上此补丁以供反馈。如果我们能找到一个合适的子集,这可能会奏效。如果这证明过于困难,也许可以引入一个编译器选项来控制是否输出足以为堆栈跟踪映射提供信息的微小子集,或者为调试(Dirac)输出稍微大一些,或者输出所有操作符。

0

评论者:darwin

Dirac以两种方式依赖源映射
1) 间接:标准的Chrome DevTools(或V8)代码在各种地方使用源映射(例如,将控制台消息行/列信息映射回原始源,或在调试器中显示正确的行,映射调试器中本地变量的名称等)
2) 直接:Dirac使用DevTools中的源映射信息在同一REPL提示中提供代码补全(它依赖于定义在源映射规范中(链接:1)的关联源映射中的"名称"列表)

我对#2有相当好的测试覆盖率,所以我会发现代码补全的任何回归。但是对于剪枝源映射如何影响DevTools/V8本身还不太清楚。

请注意,在DevTools中与ClojureScript(或其他转换语言)相关的源映射问题已知。Dirac尝试修复这些问题,但仍可能有未解决的问题。
https://github.com/binaryage/dirac/issues/53

您是否熟悉https://github.com/sokra/source-map-visualization?这个工具在我调试Dirac的源映射问题时非常有用。我认为这可以帮助确定如何生成包含相关信息的最小源映射。

(链接:1) https://sourcemaps.info/spec.html

0

评论者:darwin

仅作记录。CLJS-2993与此相关。Mike,如果您使用ClojureScript主分支做Dirac实验,您可能受此影响。

0
...