在OCaml中使用String.blit或String.sub更好吗?更好的意思是更多的时间或内存效率,甚至更多的惯用语。
即。是不是更好"要做:
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. *)
答案 0 :(得分:2)
它们都在内部调用相同的函数unsafe_blit
。我会用你的代码最清楚。
答案 1 :(得分:2)
由于这两个函数具有不同的语义,因此取决于您想要做什么。
String.blit
确实可以用来将字符串的一部分复制到一个新的字符串中,但我认为你不应该使用它来代替sub
。首先,当您切换到OCaml 4.02并尝试使用Bytes
时,这将是不好的。然后,它会使您的代码不那么清晰(并且您还必须添加字符串创建)。
另外,请注意blit
是一项必要的功能,而sub
本身就是功能性的。所以它主要取决于你的个人编程风格。但在性能方面,它们具有相当的可比性。如果开发团队决定对常量字符串使用不同的表示形式,那么这可能会改变(虽然不会匆忙,但未来几年也不会发生)。
答案 2 :(得分:0)
String.blit
允许重用相同的缓冲区或使用部分缓冲区。如果您不需要这些内容,请使用sub
。
就复杂性而言,两个操作在子串/区间的大小上都是线性的。