String.blit 与 OCaml 中的 String.sub

String.blit vs String.sub in OCaml

在 OCaml 中使用 String.blit 还是 String.sub 更好?我所说的更好是指更多的时间或内存效率,甚至更惯用。

即是 "better" 做:

let new_string = String.sub old_string 0 4;;

或者

String.blit old_string 0 new_string 0 4;; (* I guess new_string is a byte seq here. *)

他们都在内部调用同一个函数unsafe_blit。我会使用使您的代码最清晰的那个。

由于这两个函数有不同的语义,这取决于你想做什么。

String.blit 确实可以用来将字符串的一部分复制到新的新字符串中,但我认为您不应该使用它来代替 sub。首先,当您切换到 OCaml 4.02 并尝试使用 Bytes 时,这会很糟糕。然后,它会使您的代码变得不那么清晰(并且您还必须添加一个字符串创建)。

此外,请注意 blit 是命令式功能,而 sub 本身是功能性的。所以这主要取决于你个人的编程风格。但在性能方面,它们具有相当的可比性。如果开发团队决定对常量字符串使用不同的表示形式,这可能会改变(不过不要急,未来几年不会发生)。

String.blit 允许重复使用相同的缓冲区或使用部分缓冲区。如果您不需要这些东西,只需使用 sub.

就复杂度而言,这两个操作在 substring/interval 的大小上都是线性的。