构建字符串的有效方法

时间:2013-09-27 16:44:29

标签: ocaml

我想动态构建一个长字符串,然后将其写入文件。 我的代码类似于:

let str = ref ""

let appnd s =
        str := (!str ^ (Printf.sprintf "%s\n" s))

但在运行时它的工作速度非常慢。我认为这种方法效率不高。构建长字符串的最佳方法是什么?

构建字符串然后写入文件更好或直接将字符串附加到文件?

2 个答案:

答案 0 :(得分:4)

当您附加到字符串时,您必须复制它。如果你想象附加n个片段,你最终会制作大约n * n个副本。如果n很大,这个很慢。

你也选择了一种缓慢的追加方式。这会更快说:

let append s = str := !str ^ s ^ "\n"

使用Buffer而不是String可能更好。如果您对字符串的最终大小有所了解,则可以预先分配正确大小的缓冲区。它还可以更好地包装可变状态。

<强>更新

这是使用Buffer的一些简单代码:

let buf = Buffer.create 1024

let append s =
    Buffer.add_string buf s;
    Buffer.add_char buf '\n'

let getstring () =
    Buffer.contents buf

这是一个会话:

$ ocaml
        OCaml version 4.00.1

# #use "b.ml";;
val buf : Buffer.t = <abstr>
val append : string -> unit = <fun>
val getstring : unit -> string = <fun>
# append "abc";;
- : unit = ()
# append "def";;
- : unit = ()
# getstring ();;
- : string = "abc\ndef\n"

对于它的价值,我会尝试写出比这更多的功能。即,我会将缓冲区传递给想要使用它的函数,而不是将buf作为全局变量。

答案 1 :(得分:1)

您可以使用String.concat模块中的Buffer函数或数据结构。

关于最后一个问题,我不确定。这取决于我想。