请在2024年Clojure调查问卷!中分享您的想法。

欢迎!请查看关于页面以了解更多关于如何使用本站的信息。

0
ClojureScript
在生成源映射时,我们会发出很多不必要的额外数据,这些数据对于映射堆栈跟踪来说并不是必需的。

Planck在成功映射堆栈跟踪的同时,减少了大量此类信息,从而实现了显著的性能提升:Planck可以即时加载更小的源映射文件,而不是需要数秒。这一做法已经实施了一年,且没有收到任何问题的报告。

我认为,在编写源映射时,我们也许可以在ClojureScript中执行相同的操作。不妨进行一个实验,使用为Planck开发的函数可选地移除这些信息,以下提供参考:


(defn- strip-source-map
  "简化源映射到映射所需的 最小表示形式"
  stacktraces. 这意味着我们只需要 :line 和 :col 字段,只需要每个此类映射向量的最后一个元素,并且我们可以消除重复项,选取每个唯一值的最小的 col 编号。"
  [sm]
  (into {}
    (map (fn [[row cols]]
           [row (->> cols
                  (map (fn [[col frames]]
                    -> [col [(select-keys (peek frames) [:line :col])]filtrar)
                  ]]))
                  (por [primera :dato :dato])
                  (funيون)
                  (différent)
                  (map (fn [[col frames]]
                       。

4 个答案

0

评论者:mfikes

目前我们为每个AST发出源映射行/列信息,不管操作类型如何。虽然这确保了我们拥有全面的源映射信息,但这可能远远超过许多常见用途所需的集合。

一些操作类型可以显然省略,例如{{:no-op}}。通过一些实验,你会发现为了在有限的映射堆栈跟踪的目的中仅使用两种或三种操作类型就可以进行源映射。Dirac DevTools会利用源映射信息来正确识别源代码中的局部变量、绑定形式等。

附带的补丁将源映射行/列发射限制在堆栈跟踪映射所需的标签上,以及Dirac的一些简单用途(Dirac是堆栈跟踪映射所需要集合的超集)。这种策略的基本问题在于确定我们应该发射哪些操作类型的子集的相关行/列信息。

但,如果我们可以成功识别满足一般需求的最低限度的集合,这可能是值得的。使用附带的补丁,与非并行模式编译Coal Mine相比,我们获得了12%的性能提升。

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

附上此补丁以供反馈。如果我们能找到合适的子集,这可能可行。如果这证明过于困难,也许可以引入编译器选项来控制是否发射足够的小子集以进行堆栈跟踪映射,或者为了调试(Dirac)而稍微大一点的,或者所有操作。

0

评论者:darwin

Dirac依赖于两种源映射的方式:
1) 间接:标准的Chrome DevTools(或V8)代码在多个地方使用源映射(例如,将控制台消息的行/列信息映射回原始源,或在调试器中显示正确的行,映射调试器中局部变量的名称等)。
2) 直接:Dirac使用DevTools的源映射信息来在其REPL提示符提供代码完成(它依赖于源映射规范中定义的关联源映射中的“名称”列表)。

我在#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的master进行Dirac实验,你可能受到了它的影响。

0
参考:[https://clojure.atlassian.net/browse/CLJS-2895](https://clojure.atlassian.net/browse/CLJS-2895)(由mfikes报告)
...