作りました。
github
どんなパッケージ?
ディスクアクセスを減らすパッケージです。
ファイルヘッダの更新日時を確認して、最新であればファイル内容を読み取らずメモリ上の値を返す、更新されていればファイル内容を読み取って返す、といった処理をしています。
効果
自分のPCはSSDですが、それでも高速になりました。
HDDならもっと速くなる可能性があります。(HDDが手元にない><)
例
次に示すのは、http要求があったファイルの最新版を返す例です。
キャッシュしない場合 (約14000 [request/sec])
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// HTMLを返す
file, err := os.Open("data/index.html")
if err != nil {
fmt.Fprint(w, err)
return
}
io.Copy(w, file)
})
このパッケージを使った場合 (約17000 [request/sec])
// ファイルを登録
f, err := checkmodfile.RegistFile("data/index.html")
if err != nil {
fmt.Println(err)
return
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// HTMLを返す
err := f.WriteTo(w)
if err != nil {
fmt.Fprint(w, err)
return
}
})
このパッケージを使うと、SSDのPCの場合で約1.2倍高速になります。
※環境やファイルサイズによります。
リクエストがあるたび*checkmodfile.Fileを動的にMapに登録するようにすれば、複数ファイルも扱えるでしょう。
興味があれば使ったり改造してみてください。