ピティナ開発者ブログ

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


FileMakerのフィールド同士の完全一致比較の速度検証(= vs PatternCount関数)

こんにちは、Hiroyuki Noguchiです。
新入社員の平田君が入ってきて、にわかににぎやかになってきつつある当ブログ。
記事更新はこのまま新人君にお任せしっぱなしにしてもいいかなという誘惑に駆られつつも、それでは名が廃るということで、これまでとは少し変わった毛色のネタを投下します。

さて、当協会では基幹DBの一つにファイルメーカー社のFileMaker(以下:FM)を使用しています。

www.filemaker.com

このFM、少しでも触ったことある方ならお分かりかと思いますが、使いやすさ取っつきやすさは抜群ながら、一癖も二癖もあって、他DBの経験があればあるほど「あ、そこに手が届かないのか」と辛み感を覚えることがよくありますね。
そんな「FMの残念なところ」の一つに、「速度が出ない」という点があります。
「他のDBならこんなの一瞬で結果が返ってくるのに!」とハンカチを噛む思いをされる方も多いことでしょう。

でも待ってください、「FMは遅いものだ」と諦め、悟り気取りで思考停止するのはよくありません。
「少しでもパフォーマンスを改善するにはどうしたらいいか?」
これを考えていきましょう。
ということで、今回のネタは、「フィールド同士の完全一致比較の速度検証」です。
=(イコール)演算子 と PatternCount関数 とで、どっちが早く、完全一致していることを早く真偽値判定できるのか?

準備編

さて、まず、テストするための準備から始めましょう。

  1. ローカルにfmp12ファイルを一つ作ります。
    超シンプルに、テーブルは一つ、フィールドは二つ。 f:id:ptna_it:20160422100556p:plain

  2. 次に、作ったフィールド二つに、同じテキストを放り込みます。
    今回は、鴨長明方丈記』を入れてみました、文字数にして9,394字、完全一致の検証には十分でしょう。 f:id:ptna_it:20160422100844p:plain

  3. で、検証するためのスクリプトを書きます。
    ループで1,000回まわして、最後に、開始時間と終了時間の差をミリ秒で取得しています。
    面倒だったのでスクリプト2つ作ってる点は目をつぶってください。

    • =(イコール)演算子
      f:id:ptna_it:20160422101129p:plain

    • PatternCount関数
      f:id:ptna_it:20160422101140p:plain

はい、これで準備は完了です。

検証編

では実行してみましょう。

  • =(イコール)演算子
    f:id:ptna_it:20160422102311p:plain
    5回実行してみましたが、どれも6000ミリ秒(=6秒)前後でした。
    結構時間かかるものですね。

  • PatternCount関数
    f:id:ptna_it:20160422102448p:plain
    お! 早い。
    こちらも5回実行してみましたが、どれも2300ミリ秒(=2秒ちょっと)前後でした。

結果

はい、結果が出ました。
=(イコール)演算子で比較するより、PatternCount関数で判定させた方が、3倍近く早いんですね。
一致比較は、スクリプトの中に組み込むぶんにはよほどのことが無ければ誤差の範囲かもしれませんが、計算式の中で判定に使う場合は、積もり積もってかなりパフォーマンスに影響を与えることになりますね。
まあ、ここまでのマルチバイト長文を完全一致比較する機会なんて、そうそう無いものですけれども。

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