この初版は Lua 5.0 向けに書かれました。後期バージョンにはまだ大きく関連していますが、いくつかの相違点があります。
第 4 版は Lua 5.3 を対象にしており、Amazon などの書店で購入できます。
本を購入すると、Lua プロジェクトへのサポートにもなります。


21.2.1 - 少しのパフォーマンスのトリック

通常 Lua では、ファイルを 1 行ずつ読み込むよりも、ファイル全体を一括で読み込んだ方がはるかに高速です。ただし、何十 MB、何百 MB といった大きなファイルの場合には、一度に全部を読み込むことは現実的ではありません。そのような大きなファイルを最高の性能で処理したい場合には、最も高速な方法は適度に大きなチャンク(例: 8 KB) で読み込むことです。途中で改行を切ってしまうという問題を回避するには、1 つのチャンクと 1 つの行を一緒に読み込みます。

    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)