Aigle vs Bluebird


はじめに

AigleというPromiseライブラリを開発しています。このライブラリは速度・安全性・利便性を重視したライブラリで、ベンチマーク上だけでなく本番環境を考慮した最適化をしています。
今回はBluebirdと比較しつつAigleを紹介したいと思います。

Benchmark

benchmark doxbee


benchmark parallel

この上記の結果はBluebirdのBenchmarkを実行した結果でです。doxbeeは直列処理、parallelは並列処理になります。またBluebirdでは、Dependenciesが異なるBluebirdのバージョンを持つときパフォーマンスが著しく低下します。Aigleでは上記のパフォーマンス低下を防ぐ処理がされており、ベンチマーク上だけでなく本番環境でも同様のパフォーマンスが期待できます。詳しくはこちらの記事を読んでいただけたらと思います。

Functions

AigleLodashAsyncと同じような関数を多数持っており、より高速でかつより可読性の高いコードを実現できます。いくつか例を紹介したいと思います。

Aigle.map vs Bluebird.map

Aigle.mapBluebirdより1.5倍ほど高速で、かつLodashAsyncと同様、Objectの引数を持つことができます。

const object = {
  a: 1,
  b: 2,
  c: 3
};
Blubird.map(Object.keys(object), key => {
  const value = object[key];
  ...
});
Aigle.map(object, (value, key) => { ... });

またconcurrencyを使用したい場合、Aigle.mapLimitを使用することができます。これはAsync.mapLimitと似た関数になります。

const array = [1, 2, 3, 4, 5];

Bluebird.map(array, value => {
  console.log(value); // 1, 2, 5, 4, 3 オーダーが保証されていない
  return Bluebird.delay(10);
}, { concurrency: 2 });

Aigle.mapLimit(array, 2, value => {
  console.log(value); // 1, 2, 3, 4, 5 オーダーが保証されている
  return Aigle.delay(10);
});

// limitを定義しない場合、デフォルトが使用される。デフォルト値は8
Aigle.mapLimit(array, value => {
  console.log(value); // 1, 2, 3, 4, 5
  return Aigle.delay(10);
});

さらにAigleではLodashと同様のshorthandをサポートしています。

const array = [{ name: 'barney' }, { name: 'fred' }];
Aigle.resolve(array)
  .map('name') // 非同期で呼ばれる
  .then(names => console.log(names)); // ['barney', 'fred']

Aigle.mapValues

この関数はAsync.mapValuesLodash.mapValuesと同様の関数です。Aigle.mapに似た関数ですがObjectを返します。Aigleを使用することで、より可読性の高いコードを書くことができます。


const object = { a: 1, b: 2, c: 3 };
const iterator = value => Promise.resolve(value * 2);

// Bluebird
const result = {};
Bluebird.each(Object.keys(object), key => {
  const value = object[key];
  return iterator(value)
    .then(val => {
      result[key] = val;
    });
}).then(() => console.log(result)); // { a: 2, b: 4, c: 6 }

// Aigle
Aigle.mapValues(object, iterator)
  .then(result => console.log(result)); // { a: 2, b: 4, c: 6 }

Aigle.times

この関数はAsync.timesLodash.timesど同様の関数で、定義された回数iteratorを実行します。

const n = 10;
const iterator = value => Promise.resolve(value * 2);

// Bluebird
const times = [];
for (let i = 0; i < n; i++) {
  times.push(i);
}
Bluebird.map(times, iterator)
  .then(result => console.log(result)); // [0, 2, 4, ..., 18]

// Aigle
Aigle.times(n, iterator)
  .then(result => console.log(result)); // [0, 2, 4, ..., 18]

まとめ

Aigleはより高速・安全・メンテナンスがしやすいコードを実現できます。紹介した関数はほんの一部でAsyncLodashのような関数を多数持っており、AsyncLodashを使っている方でも簡単に使用することができると思います。ぜひ使ってみてください。

リンク