ocaml - 构建字符串的有效方法

标签 ocaml

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

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 可能会更好。如果您知道字符串的最终大小,则可以预先分配正确大小的缓冲区。它还更好地包装了可变状态。

更新

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

let buf = Buffer.create 1024

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

let getstring () =
    Buffer.contents buf

这是一个 session :

$ 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 成为全局变量。

关于ocaml - 构建字符串的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19056015/

相关文章:

functional-programming - 多态型与弱型

ocaml - ocaml 中的粉状机器

unix - OCaml:标准输入重定向时 Unix.getlogin 出现意外异常

ocaml - 如何在 ocaml (toplevel) 中显示长列表

ocaml - 我可以将值传递给 Ocaml 中的仿函数吗?

utf-8 - 如何在 OCaml 中创建 lambda 字符?

ocaml - 如何将给定文件的全部内容读入字符串?

f# - 为什么这个 F#/OCaml "match"表达式会编译?

debugging - 执行二进制文件时是否可以回溯 "failwith"错误?

list - OCaml:List.fold_left 是如何工作的?