我想动态构建一个长字符串,然后将其写入文件。我有一个类似的代码:
let str = ref ""
let appnd s =
str := (!str ^ (Printf.sprintf "%s\n" s))
但是在运行时它工作得非常慢。我认为这种方法效率不高。构建长字符串的最佳方法是什么?
构建字符串然后写入文件更好还是直接将字符串附加到文件?
我想动态构建一个长字符串,然后将其写入文件。我有一个类似的代码:
let str = ref ""
let appnd s =
str := (!str ^ (Printf.sprintf "%s\n" s))
但是在运行时它工作得非常慢。我认为这种方法效率不高。构建长字符串的最佳方法是什么?
构建字符串然后写入文件更好还是直接将字符串附加到文件?
当您附加到一个字符串时,您必须复制它。如果你想象附加 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
一个全局变量。
您可以使用模块中String.concat
的函数或数据结构Buffer
。
关于最后一个问题我不确定。这取决于,我想。