定义所有新语法是否会影响 Scheme、Racket 的性能?
Does defining all new syntaxes hurt performance in Scheme, Racket?
我正在使用 Racket define-syntax-parser 创建一个新语言。许多新语法甚至替换了基本形式。
我打算在生产中使用新语言,但不知道太多新语法是否会影响性能。
我应该编译成二进制还是类似的?
TL; DR:没有性能损失
您引入的语法在宏扩展时得到扩展。这意味着如果您执行 raco make
,它将用扩展形式替换所有宏的使用。
有时在制作功能时,您的扩展代码可能比您最初编写代码的方式更复杂。这也可能被 jit 编译器删除,就像其他未优化的代码一样。
有时您的功能需要更加复杂,无法简化为最简单的形式。在这种情况下,您可能会损失性能。
例如,覆盖 #%app
以执行数组和列表访问,而您通常会执行 (vector-ref vec 3)
,其中语法 (vec 3)
可以表示数组访问和应用程序。扩展可能会变成 (if (racket:#%app vector? vec) (racket:#%app vector-ref vec 3) (racket:#%app vec 3))
,如果系统无法断定它不是 vector?
,它将对每个应用程序进行测试。如果重新调整 [
和 ]
的用途,使它们只是数组访问 [vec 5]
可以很容易地变成 (vector-ref vec 3)
而 (vec 5)
不会影响性能,但那也表示语法告诉您它是什么并且不太通用。
我正在使用 Racket define-syntax-parser 创建一个新语言。许多新语法甚至替换了基本形式。
我打算在生产中使用新语言,但不知道太多新语法是否会影响性能。
我应该编译成二进制还是类似的?
TL; DR:没有性能损失
您引入的语法在宏扩展时得到扩展。这意味着如果您执行 raco make
,它将用扩展形式替换所有宏的使用。
有时在制作功能时,您的扩展代码可能比您最初编写代码的方式更复杂。这也可能被 jit 编译器删除,就像其他未优化的代码一样。
有时您的功能需要更加复杂,无法简化为最简单的形式。在这种情况下,您可能会损失性能。
例如,覆盖 #%app
以执行数组和列表访问,而您通常会执行 (vector-ref vec 3)
,其中语法 (vec 3)
可以表示数组访问和应用程序。扩展可能会变成 (if (racket:#%app vector? vec) (racket:#%app vector-ref vec 3) (racket:#%app vec 3))
,如果系统无法断定它不是 vector?
,它将对每个应用程序进行测试。如果重新调整 [
和 ]
的用途,使它们只是数组访问 [vec 5]
可以很容易地变成 (vector-ref vec 3)
而 (vec 5)
不会影响性能,但那也表示语法告诉您它是什么并且不太通用。