msful チューニングを行うの巻

msful と言う、最初nodejsで簡単なマイクロサービスをつくろうかと簡易的なWebAPIサーバ的なものを作ってみて面白いので色々と機能をあれやこれやとしていくと、何だかよさそうになり、npmに登録してみると結構ダウンロードされていたりして、それにつられて色々と機能追加を続ける日々を送っているのが、この存在ですw
msful - npm

気がつけばversion0.0.1 から始まって現在は0.0.37 とモリモリ機能追加を続けていく今日この頃。
と言うか暇なときに気ままに、機能追加できてすぐに動かせるってのがよいよねNodeJS。
だけど欠点は、abベンチとかで実行すると遅いってのがあるわけでして。
こんな感じ。

$ ab -c 50 -n 10000 http://127.0.0.1:3333/api/test
Server Software: msful(0.0.36)
Server Hostname: 127.0.0.1
Server Port: 3333

Document Path: /api/test
Document Length: 227 bytes

Concurrency Level: 50
Time taken for tests: 11.391651 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 5490000 bytes
HTML transferred: 2270000 bytes
Requests per second: 877.84 [#/sec] (mean)
Time per request: 56.958 [ms] (mean)
Time per request: 1.139 [ms] (mean, across all concurrent requests)
Transfer rate: 470.61 [Kbytes/sec] received

まあ、実装内容次第ではあると思うのだけど、やっていることは単純でこんな感じのこと

// entity examples

require("./lib/entities")

var user1 = {
  id: "12",
  name: "maachang",
  age:40,
  mail:"maachang@maachang.com"
};

var user2 = {
  id: "21",
  name: "saito",
  age:27,
  mail:"saito@maachang.com"
};

var users = {
  limit: 2,
  list: [user1, user2]
}

return entity.make("users", users);

./lib/entities.js

// entities.

entity.expose("user"
  ,"id"       ,"number"     ,"num | rename 'number'"
  ,"name"     ,"string"     ,"req"
  ,"details"  ,"{"          ,""
    ,"age"    ,"number"     ,"num"
    ,"mail"   ,"string"     ,"email"
  ,"details"  ,"}"          ,""
  ,"code"     ,"string"     ,"default 'unknown'"
);

require("./lib/entityParent");

./lib/entityParent.js

// entityParent

entity.expose("users"
  ,"offset"   ,"number"     ,"default 0"
  ,"limit"    ,"number"     ,"default 0"
  ,"list"     ,"$user"      ,""
);

とテスト的なAPI実装をそのままApacheABでぶん回しただけのものなんだけど、まあ遅いと言うかもう少し速度が出て欲しいな~って思った。
と言うわけでチューニング。
実行処理自身をキャッシュ化すればOKってことで、ごにょごによとキャッシュ化。
以下実装部分ね。
APIをキャッシュ化 v0.0.37 · maachang/msful@03860bd · GitHub

で、もう一度ベンチを図る。

$ ab -c 50 -n 10000 http://127.0.0.1:3333/api/test
Server Software: msful(0.0.37)
Server Hostname: 127.0.0.1
Server Port: 3333

Document Path: /api/test
Document Length: 227 bytes

Concurrency Level: 50
Time taken for tests: 4.893279 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 5490000 bytes
HTML transferred: 2270000 bytes
Requests per second: 2043.62 [#/sec] (mean)
Time per request: 24.466 [ms] (mean)
Time per request: 0.489 [ms] (mean, across all concurrent requests)
Transfer rate: 1095.58 [Kbytes/sec] received

おおー倍以上の性能がw