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

欢迎!请在关于页面上了解如何使用本站。

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

Planck 在保持成功映射堆栈跟踪的同时,裁剪了大量这些信息,大大提高了性能:Planck 立即加载较小的源映射文件,而不是秒数。这一做法已实施一年,至今尚未接到任何问题报告。

我认为,在进行ClojureScript源映射的写入时,我们也许能够做到同样的事情。进行一个实验,尝试使用为Planck开发的函数(此处做参考)可选地清理这些信息是值得的


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

4 答案

0投票

评论者:mfikes

我们目前会为每个AST发出源映射行/列信息,无论操作类型如何。虽然这保证了我们有全面地源映射信息,但它可能比许多常见用途所需的数据集要大得多。

一些操作类型可以明确省略,例如 {{:no-op}}。经过一点实验,你会发现仅用两种或三种操作类型就可以实现针对映射堆栈跟踪的限制性源映射。Dirac DevTools利用源映射信息更广泛地识别源代码中的局部变量、绑定形式等。

附件中的补丁限制了源映射的行/列输出仅限于堆栈跟踪所需的标签,以及一些简单的Dirac使用(这是堆栈跟踪所需集的超集)。这个策略的基本问题是确定正确输出行/列信息的操作子集。

但是,如果可以成功地识别出一个满足一般需求的极小化集合,这可能就是值得的。使用这个附件中的补丁,在非并行模式下编译Coal Mine时,相对于当前的master,我们可以获得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 master做Dirac的实验,你可能受到了它的影响。

0投票
...