GHCJS 文本数据构造器
GHCJS Text Data Constructor
我正在使用带反射平台的 nix,使用 GHCJS 8.0.1 将 haskell 编译为 javascript。我已经编写了一些依赖 text
库中的内部模块的函数:Data.Text.Internal
。我唯一需要的是 Text
:
的数据构造函数
data Text = Text
{-# UNPACK #-} !A.Array -- payload (Word16 elements)
{-# UNPACK #-} !Int -- offset (units of Word16, not Char)
{-# UNPACK #-} !Int -- length (units of Word16, not Char)
但是,当我尝试通过 GHCJS 编译使用此数据构造函数的代码时,它失败了。错误消息清楚地表明,在某处,Text
的数据构造函数已被替换为:
newtype Text = Text JSString
我知道我可以在代码块周围放置 #ifdef
s 来解决这个问题。但是,我不知道这个数据构造函数替换是如何完成的。 ghcjs-shims
中的任何地方都没有提到这一点。也没有提到 ghcjs
。更奇怪的是 ghcjs-base
的函数使用 Text
的普通数据构造函数。如果有人能指出这个替换的来源,我将不胜感激。
编辑:这与问题无关,但我需要使用 Text
内部结构的原因是为了有效地编码 IPv4 地址和 MAC 地址之类的东西。在我的 benchmarks I included with a previous question 中,我发现使用 text
的 public API 最快的 IPv4 编码大约需要 450ns。使用内部结构(并直接写入可变数组),我可以在大约 35ns 内完成此操作,这至少提高了 10 倍的性能。
编辑 2:我刚刚记得的另一件事(可能与问题相关)是在我代码的另一个地方,我使用了 Data.Text.Lazy.Builder.Int 中的 hexadecimal
。然而,对于 ghcjs,这个函数不会被这个模块导出。我很乐意在某个地方的上游贡献它,但由于我不明白 text
中的所有模块是如何被填充的,所以我不知道合适的上游在哪里。如果有人能指出完成此操作的特定文件,我将不胜感激。
您可能正在使用 reflex-platform。我们最近集成了一个更改,将 JSString 用于 Text 而不是通常的实现;那是因为 JSString 比纯 Haskell 文本实现快得多并且使用的内存少得多。
如果这是您 运行 的爱好,我鼓励您坚持使用 JSString,除非您对性能完全不关心。但是,如果您想禁用此优化,我认为只需注释掉 this block 然后重新输入您的 try-reflex/work-on/nix-shell.
就可以了
我正在使用带反射平台的 nix,使用 GHCJS 8.0.1 将 haskell 编译为 javascript。我已经编写了一些依赖 text
库中的内部模块的函数:Data.Text.Internal
。我唯一需要的是 Text
:
data Text = Text
{-# UNPACK #-} !A.Array -- payload (Word16 elements)
{-# UNPACK #-} !Int -- offset (units of Word16, not Char)
{-# UNPACK #-} !Int -- length (units of Word16, not Char)
但是,当我尝试通过 GHCJS 编译使用此数据构造函数的代码时,它失败了。错误消息清楚地表明,在某处,Text
的数据构造函数已被替换为:
newtype Text = Text JSString
我知道我可以在代码块周围放置 #ifdef
s 来解决这个问题。但是,我不知道这个数据构造函数替换是如何完成的。 ghcjs-shims
中的任何地方都没有提到这一点。也没有提到 ghcjs
。更奇怪的是 ghcjs-base
的函数使用 Text
的普通数据构造函数。如果有人能指出这个替换的来源,我将不胜感激。
编辑:这与问题无关,但我需要使用 Text
内部结构的原因是为了有效地编码 IPv4 地址和 MAC 地址之类的东西。在我的 benchmarks I included with a previous question 中,我发现使用 text
的 public API 最快的 IPv4 编码大约需要 450ns。使用内部结构(并直接写入可变数组),我可以在大约 35ns 内完成此操作,这至少提高了 10 倍的性能。
编辑 2:我刚刚记得的另一件事(可能与问题相关)是在我代码的另一个地方,我使用了 Data.Text.Lazy.Builder.Int 中的 hexadecimal
。然而,对于 ghcjs,这个函数不会被这个模块导出。我很乐意在某个地方的上游贡献它,但由于我不明白 text
中的所有模块是如何被填充的,所以我不知道合适的上游在哪里。如果有人能指出完成此操作的特定文件,我将不胜感激。
您可能正在使用 reflex-platform。我们最近集成了一个更改,将 JSString 用于 Text 而不是通常的实现;那是因为 JSString 比纯 Haskell 文本实现快得多并且使用的内存少得多。
如果这是您 运行 的爱好,我鼓励您坚持使用 JSString,除非您对性能完全不关心。但是,如果您想禁用此优化,我认为只需注释掉 this block 然后重新输入您的 try-reflex/work-on/nix-shell.
就可以了