前記事
FileMaker-Let関数でフィールド内容を変数に入れておくとどれくらい計算結果が速くなるか?_テキストフィールド編
上記、前記事からの続きです。
FileMakerのLet関数とは? とか、その他諸々の前提については前記事をご参照ください。
検証にあたっての環境・条件等
実行環境ですが、
- Windows7 64bit
- FileMakerPro15 Advanced
です。
条件としては、
前回と同じ条件
- テキストフィールド a, b, c の3つを用意
- a には文字列「ピティナ開発者ブログ」を格納(全角10文字)
- b には文字列「方丈記の全文」を格納(全角およそ9400文字)
- c には文字列「a」を格納(半角1文字)
今回の条件
- 計算フィールド c_a, c_b, c_c の3つを用意
- c_a, c_b, c_c はすべて索引設定をおこなわない(計算結果を保存せず必要時に再計算)
- c_a, c_b, c_c それぞれに対して、変数resultに値を格納することを1,000回ループ
- 変数resultの中身は、c_a, c_b, c_c それぞれを改行区切りで10回繰り返したもの
計算フィールドの中身
- c_a
- 単にテキストフィールド a, b, c を連結したもの。
a & b & c
- c_b
- テキストフィールド b からFilter関数を用いて平仮名だけ抽出したもの。
Filter ( b ; "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん" )
- c_c
- 計算フィールド c_a, c_b を連結したもの。
c_a & c_b
これで、何秒かかるのかを計測してみます。
なるべく、余計なif分岐で計測ノイズを混ぜないように、スクリプトはあえて全部分けて作っています。
Let関数を使わずにやってみる
まずはLet関数を使わずにやってみましょう。
Let関数を使わない場合の速度結果
フィールド | 文字数 | 時間 |
---|---|---|
c_a | a, b, c 連結 | 12.28秒 |
c_b | b にFilter関数かけて平仮名のみにする | 33.45秒 |
c_c | c_a, c_b 連結 | 45.61秒 |
非常にわかりやすい結果が出ました。
Filter関数かけるとやっぱりそれなりに時間かかるのは予想通りです。
また、 c_a, c_b を連結すると、単純に、それぞれの計算にかかっていた時間の和になっています。
計算式内で別の計算フィールドを複数使っても、複雑度が増して余計に時間がかかる、ということはなく、単なる加算でしかないようです。
さて、上記の数字が出たということは、Let関数を使った場合の結果も、既におおよその予想はつくのではないでしょうか。
計算を10回繰り返しているわけですから、Let関数を使って計算を最初の1回きりにしてしまえば、理屈上、1/10の速度で済むという話ですよね。
Let関数を使ってやってみる
さあ、それでは、Let関数を使ってみます。
Let関数を使った場合の速度結果
フィールド | 文字数 | 時間 |
---|---|---|
c_a | a, b, c 連結 | 01.83秒 |
c_b | b にFilter関数かけて平仮名のみにする | 03.88秒 |
c_c | c_a, c_b 連結 | 05.36秒 |
はい、まさしく予想通りの結果になりました。
ストレートに1/10になったわけではないですが、そこは、最初の1回に少し時間がかかるってことでしょうかね。
結論
繰り返し使用するフィールド内の値が重ければ重いほど、Let関数を用いて変数定義して使った方が、計算結果が速くなります。
……という、前回に続いての結論と全く同じなわけですが、より、論の強度が増した、といえますね。
で、続編としてもう一つ、「_外部フィールド編」で検証を続けてみたいと思います。
前回・今回と、単一テーブル内だけで見ていましたが、「リレーションを組んだ別テーブル」そして「リレーションを組んだ別ファイルの別テーブル」にあるフィールドを参照する場合、どうなるか、というのを見てみます。
しばしのお待ちを(書いたらリンクつけます)