Ocaml 构建字符串的有效方法

Ocaml 构建字符串的有效方法,ocaml,Ocaml,我想动态构建一个长字符串,然后将其写入文件。 我的代码类似于: let str = ref "" let appnd s = str := (!str ^ (Printf.sprintf "%s\n" s)) 但在运行时,它的工作速度非常慢。我认为这种做法效率不高。构建长字符串的最佳方法是什么 构建字符串然后写入文件更好,或者直接将字符串附加到文件?您可以使用string.concat函数或Buffer模块中的数据结构 关于最后一个问题,我不确定。我想这要看情况而定。当你附加

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

let str = ref ""

let appnd s =
        str := (!str ^ (Printf.sprintf "%s\n" s))
但在运行时,它的工作速度非常慢。我认为这种做法效率不高。构建长字符串的最佳方法是什么


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

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


关于最后一个问题,我不确定。我想这要看情况而定。

当你附加到一个字符串时,你必须复制它。如果你想象附加n个片段,你最终会得到大约n*n个拷贝。如果n是大的,这是缓慢的

您还选择了一种缓慢的附加方式。如果说:

let append s = str := !str ^ s ^ "\n"
最好使用缓冲区而不是字符串。如果您知道字符串的最终大小,可以预先分配适当大小的缓冲区。它还可以更好地包装可变状态

更新

下面是一些使用缓冲区的简单代码:

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"
$ocaml
OCaml版本4.00.1
##使用“b.ml”;;
val buf:Buffer.t=
val追加:字符串->单位=
val getstring:单位->字符串=
#附加“abc”;;
-:单位=()
#附加“def”;;
-:单位=()
#getstring();;
-:string=“abc\ndef\n”

为了它的价值,我会尝试写更多的功能比这。也就是说,我会将缓冲区传递给想要使用它的函数,而不是使
buf
成为一个全局变量。

感谢您建议使用缓冲区。在哪里可以找到使用缓冲区的示例?上次我检查时,编译器为
做了一些比较愚蠢的事情!str^s^“\n”
。如果要连接任意数量的字符串,我的赌注是
Printf.sprintf“%s%s%s…”
。这太出乎意料了。谢谢你的信息。(OP注意:我添加了示例缓冲区代码。)感谢您推荐缓冲区。在哪里可以找到使用缓冲区的示例?