Islands in the byte stream

Technical notes by a software engineer

NodeJS v12.9.0 で writev(2) へのインターフェイスが追加された

writev(2) は バイト列の配列を1つのシステムコールでまとめて書き込めるやつです。

NodeJS的には、ArrayBufferView (典型的にはtyped array)の配列を fs.writev() (または fs.writevSync()FileHandle#writev())に渡せるようなインターフェイスになってます。もっとも、このwritev(2)へのインターフェイス自体は2015年にWriteStream用のprivate APIとして実装されて*1、今回はそれをfs moduleで正式に使えるようにしたってだけみたいですけどね*2

例:

"use strict";

const fs = require("fs");

const te = new TextEncoder();
const iov = [
  te.encode("Hello, "),
  te.encode("world!"),
  te.encode("\n"),
];

const result = fs.writevSync(process.stdout.fd, iov);

出力:

Hello, world!

細かなバイト列の断片を連結せずに一度のシステムコールでwriteできるので、状況によってはかなりの数のシステムコールを減らせる可能性があります。サーバーの実装ではよく使いそうですね。