第一版是为 Lua 5.0 编写的。虽然对于后续版本来说仍然基本适用,但有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目


21.2.1 – 一个小性能技巧

通常,在 Lua 中,一次性读取整个文件比逐行读取要快得多。但是,有时我们必须面对一些大文件(比如几十或几百兆字节),一次性读取所有内容是不合理的。如果您想以最高性能处理如此大的文件,最快的办法是将它们分成相当大的块(例如,每个 8 KB)进行读取。为了避免在中间断行的问题,您只需要求读取一个块加上一行

    local lines, rest = f:read(BUFSIZE, "*line")
变量 rest 将获取被块中断的任何行的其余部分。然后,我们将块和这行剩余部分连接起来。这样,生成的块将始终在行边界处中断。

该技术的典型示例是这个 wc 实现,这是一个用于统计文件中字符、单词和行数的程序

    local BUFSIZE = 2^13     -- 8K
    local f = io.input(arg[1])   -- open input file
    local cc, lc, wc = 0, 0, 0   -- char, line, and word counts
    while true do
      local lines, rest = f:read(BUFSIZE, "*line")
      if not lines then break end
      if rest then lines = lines .. rest .. '\n' end
      cc = cc + string.len(lines)
      -- count words in the chunk
      local _,t = string.gsub(lines, "%S+", "")
      wc = wc + t
      -- count newlines in the chunk
      _,t = string.gsub(lines, "\n", "\n")
      lc = lc + t
    end
    print(lc, wc, cc)