計算式プラグインで、非同期計算のパフォーマンス改善を行ったのでそれを検証します。
※計算式プラグイン Ver.93 で検証
概要
計算式プラグインは、計算式に指定している項目値が変化すると kintone の値変更イベント処理で、計算処理を実行します。
ただ計算式で変更した項目を参照している他の項目があると、さらに値変更イベント処理が発生して計算処理の回数が増えていきます。
もっとも影響が出るのは、テーブル内項目に計算式を設定している場合です。
最大テーブル行数*項目数の値変更イベント処理が発生して計算処理回数が増大します。
※テーブル行数・項目数に比例して、計算処理回数が増大
※SUM関数などの集計関数では、指数的に処理が増大
計算式プラグイン設定で「非同期計算」をチェックすると、2回目以降の値変更イベントをスキップして無駄な計算処理を削減します。
※値変更イベントは発生するが、計算処理をスキップ
ただし計算によっては、非同期計算によって計算結果が変わるケースがあります。
その場合は、ランクを指定して項目の計算順を変えることで対応します。
テーブル計算の例
単純に係数の値をテーブル内3項目に反映させる例です。
計算回数がわかるように、LOG 関数でイベントタイプを表示しています。
非同期計算ありでは、テーブル内項目の値変更イベントの計算処理が削減されます。
- 非同期計算なし
- テーブル外項目の係数値変更イベントが 1回
- テーブル内項目の値変更イベントが 10回(5行*2項目)
- 非同期計算あり
- テーブル外項目の係数値変更イベントが 1回
テーブル集計の計算処理(SUM関数使用時の処理回数)
上記の例に、SUM などテーブルの集計関数を使った場合、計算量が指数的に増大します。
テーブル外に「数量T1合計」を追加して、SUM(数量T1)とすると、合計処理の回数は?
非同期計算 | テーブル行数 | 値変更イベント回数 | 処理単位(行×2) | 合計処理回数 |
---|---|---|---|---|
なし | 10 | 11 | 10行 × 2 | 220 |
あり | 10 | 1 | 10行 × 2 | 20 |
なし | 100 | 101 | 100行 × 2 | 20,200 |
あり | 100 | 1 | 100行 × 2 | 200 |
※ 合計処理回数 = 値変更イベント回数 × 行数 × 2
※ 処理は「テーブル外項目 → テーブル内項目 → テーブル外項目」の順で2回発生
計算式プラグイン設定
あえてテーブル内項目の値変更イベントが発生するように、数値T1,数値T2 を計算式で指定しています。
計算処理は、「テーブル外項目・テーブル内項目・テーブル外項目」をセットで計算します。
LOGは、EV_INFO("step")=0 で、1回目のテーブル外項目処理時に実行します。
OPTION: 非同期計算
// テーブル.数値T1 NUMBER
係数
// テーブル.数値T2 NUMBER
数値T1
// テーブル.数値T3 NUMBER
数値T2
// 備考 SINGLE_LINE_TEXT
IF(EV_INFO("step")=0,
LOG("COUNT-CHECK", EV_INFO("type"))
)
非同期計算で、計算結果が変わるケース
テーブル内項目は、既定で左の項目から右へ計算処理を行います。
そのため右の項目の’計算結果を参照する場合は、計算前の値を参照してしまいます。
※値変更イベントが複数あると、結果的に計算後の値を参照する。
係数を変更しても数値T3しか変更されないケース
変更前の数値T3 を参照するので、数値T1・数値T2 は、元の値のまま。
OPTION: 非同期計算
// テーブル.数値T1 NUMBER
数値T3
// テーブル.数値T2 NUMBER
数値T1
// テーブル.数値T3 NUMBER
係数
// 備考 SINGLE_LINE_TEXT
IF(EV_INFO("step")=0,
LOG("COUNT-CHECK", EV_INFO("type"))
)
ランク指定による計算順番の変更
先に計算してほしい項目にランクを指定することで、計算順番を変更できます。
※ランクが大きい項目を先に計算します。ランク未指定は、ランク 0 と同じ
今回は、数値T3 にランク1を指定することで、他より先に計算を行います。
OPTION: 非同期計算
// テーブル.数値T1 NUMBER
数値T3
// テーブル.数値T2 NUMBER
数値T1
// テーブル.数値T3 NUMBER (rank:1)
係数
// 備考 SINGLE_LINE_TEXT
IF(EV_INFO("step")=0,
LOG("COUNT-CHECK", EV_INFO("type"))
)
ランク指定で、期待する結果に
数値T3 を先に計算するので、数値T1・数値T2 に計算後の結果が反映される。