読者です 読者をやめる 読者になる 読者になる

ピティナ開発者ブログ

全日本ピアノ指導者協会のIT担当者が気まぐれにつづる技術系中心のブログです


FileMaker-Let関数でフィールド内容を変数に入れておくとどれくらい計算結果が速くなるか?_テキストフィールド編

Hioryuki Noguchiです。
2017年もすっかり春の陽気が続いていますね(ブログ記事更新ご無沙汰しておりますの意)

さて、今回は、FileMakerにおいてLet関数を用いることで、どれくらい計算結果が速くなるかという検証をしてみます。

Let関数とは

FileMakerのLet関数とはなんぞや?という方はこちらから。 FileMaker Pro 15 Help

簡単に言うと、Let関数という閉じられたスコープ内において、ここだけで使える変数を独自定義して計算できるよ、という便利なやつです。

こいつを活用することで計算式内における再帰ループとか実現することができるのですが、そのあたりのチョイ難しい話は今回は割愛します。
Let関数を使おうとしてそんなネタばかり検索結果に出てくるものだから、Let関数=上級者向け関数とか勘違いされているきらいがあるのですが、全然そんなことなく、読みやすい計算式を書くために+パフォーマンス向上にガシガシ活用していきましょう。

で、今回は、パフォーマンス向上に焦点を当てます。

Let関数についてもうちょっと詳しく! 使い方の例えとか!

例えば、

test_table::test_field

というフィールドがあるとしますよね。
これをスペース区切りで3回呼び出そうとすると、

test_table::test_field & " " & test_table::test_field & " " & test_table::test_field

みたいなことになるわけです。
ただ、「テーブル名とかもう分かったから! いちいち出てきて目障りなんだけど!」という感じがしますよね。
テーブルオカレンス名とフィールド名との区切り記号であるところの「::」←これが何かもう、ゲシュタルト崩壊してくる。

じゃあ、Let関数を使うとどう書けるか。
こうじゃ。

Let (
  test_field = test_table::test_field;

  test_field & " " & test_field & " " & test_field
)

Let関数内で定義している変数名 test_field の部分は何でもいいです。
aとかでもいい。
さらにいうと、変数は複数定義できます。
定義は上から評価されるので、2つめに定義する変数で、1つめに定義した変数を使うこともできます。

以下のようにも書ける。

Let (
  [
    test_field = test_table::test_field;
    test_field_zenkaku = KanaZenkaku(test_field);
  ];

  test_field & " " & test_field & " " & test_field_zenkaku
)

同じ変数をどんどん定義し直していくこともできますので、これ使うと、フィールド内の文字列整形とかもわりと綺麗に書けます。

Let (
  [
    test_field = test_table::test_field;
    test_field = RomanHankaku(test_field);
    test_field = Substitute(test_field; "hoge"; "fuga")
  ];

  test_field & " " & test_field & " " & test_field
)

さて、こんなところで、Let関数ってそもそも何ぞや、というのはお分かりいただけたかと思います。
では、Let関数を使うとどのようにパフォーマンスが上がるのか、というのを以後、見ていきます。

検証にあたっての環境・条件等

実行環境ですが、

  • Windows7 64bit
  • FileMakerPro15 Advanced

です。

条件としては、

  • テキストフィールド a, b, c の3つを用意
  • a には文字列「ピティナ開発者ブログ」を格納(全角10文字)
  • b には文字列「方丈記の全文」を格納(全角およそ9400文字)
  • c には文字列「a」を格納(半角1文字)
  • a, b, c それぞれに対して、変数resultに値を格納することを1,000回ループ
  • 変数resultの中身は、a, b, c それぞれを改行区切りで10回繰り返したもの

これで、何秒かかるのかを計測してみます。
なるべく、余計なif分岐で計測ノイズを混ぜないように、スクリプトはあえて全部分けて作っています。
以下のような感じです。

f:id:ptna_it:20170423162306p:plain

Let関数を使わずにやってみる

まずはLet関数を使わずにやってみましょう。
変数resultで実行している計算式は以下のようになります。

test::a & ¶ & 
test::a & ¶ & 
test::a & ¶ & 
test::a & ¶ & 
test::a & ¶ & 
test::a & ¶ & 
test::a & ¶ & 
test::a & ¶ & 
test::a & ¶ & 
test::a

さて、a, b, c それぞれの結果やいかに?

Let関数を使わない場合の速度結果

フィールド 文字数 時間
a 全角10文字 00.16秒
b 全角約9,400文字 11.49秒
c 半角1文字 00.11秒

aとcとでも有意差が出ました(繰り返し実行してみてもこのあたりの時間で収束する)
bについてはもう、明らかですね。

Let関数を使ってやってみる

さて、次に、Let関数を使ってみます。

変数resultで実行している計算式は以下のようになります。

Let (
  a = test::a;

  a & ¶ & 
  a & ¶ & 
  a & ¶ & 
  a & ¶ & 
  a & ¶ & 
  a & ¶ & 
  a & ¶ & 
  a & ¶ & 
  a & ¶ & 
  a
)

さあ、こちらも、a, b, c それぞれの結果やいかに?

Let関数を使った場合の速度結果

フィールド 文字数 時間
a 全角10文字 00.10秒
b 全角約9,400文字 01.77秒
c 半角1文字 00.09秒

aとcとの間にあった有意差がほとんど無くなりました。
bについては、目に見えて、歴然と減りましたね。
1/10、とまではいかないものの、がっつりと。

結論

繰り返し使用するフィールド内の値が重ければ重いほど、Let関数を用いて変数定義して使った方が、計算結果が速くなります。
全角およそ9,400文字が格納されたフィールドの場合、Let関数を用いれば1/7くらいの速度で計算できます。

今回、「テキストフィールド編」と銘打ったので、次の記事では、「計算フィールド編」で検証を続けてみたいと思います。
自己テーブル内のテキストフィールドでこれだけ速くなるのだから、外部テーブルをまじえた計算フィールドを使うとなったら、どれだけ速くなるのやら……!?

ptna.hateblo.jp

(著: Hiroyuki Noguchi)
この記事は現在0人が閲覧中