FileMaker の機能の速度測定

FileMaker Advent Calendar 2020 7 日目の記事です。

同じ答えに辿り着くために、さまざまな解法があるのは、経験則で知っているかと思いますが、一番最初に知った一つの解法でずっとやり続けてしまう傾向が私にはあります。

今まで使っていた解法を今一度、速度の点から一度確認してみよう、という記事になります。


Loop

私はスクリプトステップの中で Loop を作るときには、Loop の次は必ず、Exit Loop If を入れるようにしています。その理由は、一番最初の Loop を回すべきかどうかを確実にコントロールできるからです。

パターン 1 ( より一般的 )

ウインドウの固定
変数を設定 [ $i ; 値: "" ] 
変数を設定 [ $max ; 値: Get ( スクリプト引数 ) ] 
変数を設定 [ $ms ; 値: Get ( 現在の時刻 UTC ミリ秒 ) ] 
Loop
	変数を設定 [ $i ; 値: $i + 1 ] 
	Exit Loop If [ $i > $max ] 
	# 処理
End Loop
変数を設定 [ $ms ; 値: Get ( 現在の時刻 UTC ミリ秒 ) - $ms ] 

パターン 2 ( 私はこちら。 )

ウインドウの固定
変数を設定 [ $i ; 値: "" ] 
変数を設定 [ $max ; 値: Get ( スクリプト引数 ) ] 
変数を設定 [ $ms ; 値: Get ( 現在の時刻 UTC ミリ秒 ) ] 
Loop
	Exit Loop If [ Let ( $i = $i + 1 ; $i > $max ) ] 
	# 処理
End Loop
変数を設定 [ $ms ; 値: Get ( 現在の時刻 UTC ミリ秒 ) - $ms ] 

計測結果

変数を設定する分、Let 関数でコントロールすると速くなるようである。デメリットしては、比較的 FileMaker 歴が短い人 ( 新入社員 ) など、Let 関数に馴染みのない人にとって大きなハードルとなりうることである。速度より、わかりやすさを優先させる場合は、きちんと変数を設定した方がいいと思われる。

画像1

画像7


空白かどうか

変数などに、値が入っているかどうかを判定する方法はいくつかある。基本的には IsEmpty ( $Data )  や $Data = "" といった表記をさせていると思う。

IsEmpty ( $Data )

not IsEmpty ( $Data )

$Data ≠ ""

$Data = ""

$Data <> ""

Exact ( $Data ; "" )

画像2

画像3

基本的には空白かどうかを知りたければ、IsEmpty ( $Data ) を使えばいい。

( ms は目安。ms を得るために、Loop を利用している。Loop するために、約 0.01 ms 程利用しているので、上記グラフから、約 0.01 ms を差し引けば、実際の値になる。)

個人的には、<> を使うことが多かったので、これを機会にすこし考えたいと思う。( たぶん ≠ か、Exact 関数 を使うと思う )

検索

検索に関しては、次のような比較をしてみた。

パターン 1

ウインドウの固定
変数を設定 [ $ms ; 値: Get ( 現在の時刻 UTC ミリ秒 ) ] 
Loop
	Exit Loop If [ Let ( $i = $i + 1 ; $i > $max ) ] 
	検索モードに切り替え [ 一時停止: オフ ] 
	フィールド設定 [ Table::Field ; Get ( UUID ) ] 
	エラー処理 [ オン ]
	検索実行 [] 
	エラー処理 [ オフ ]
End Loop
変数を設定 [ $ms ; 値: ( Get ( 現在の時刻 UTC ミリ秒 ) - $ms ) ] 

パターン 2

ウインドウの固定
変数を設定 [ $ms ; 値: Get ( 現在の時刻 UTC ミリ秒 ) ] 
Loop
	Exit Loop If [ Let ( $i = $i + 1 ; $i > $max ) ] 
	エラー処理 [ オン ]
	クイック検索の実行 [ Get ( UUID ) ] 
	エラー処理 [ オフ ]
End Loop
変数を設定 [ $ms ; 値: ( Get ( 現在の時刻 UTC ミリ秒 ) - $ms ) ] 

上記パターンのほかにも速度を測定してみた。( 図参照 )

[検索モードに切り替え]と、[検索実行]に少し時間がかかっているのがわかる。[検索モード切り替え]と[検索実行]をする必要のないクイック検索が速いのがわかる。

クイック検索の対象のフィールドは、インスペクタで設定することができる。( 数が多くなったり、非保存の計算フィールドがあると、そこまで検索してしまうので注意。今回は、レイアウト上には 1 フィールドだけをクイック検索の対象とした。 )

画像4


レコード移動

レコード移動する方法も速度を確認してみた。

	レコード/検索条件/ページへ移動 [ 次の ; 最後まできたら終了: オン ]

	レコード/検索条件/ページへ移動 [ 次の ; 最後まできたら終了: オフ ]

	レコード/検索条件/ページへ移動 [ ダイアログあり: オフ ; $i ]

	レコード/検索条件/ページへ移動 [ 最初の ]

	レコード/検索条件/ページへ移動 [ 最後の ]

画像5

画像6

個人的には、エラーを吐く「次の」「前の」オプションは基本的に使わずに、計算式で指定していたりするが、一番遅いようだ。悩みどころである。

エクスポート

エクスポートは CSV などと比べると Excel や fmp12 は遅い、という結果になった。

画像8

画像9

繰り返しフィールドの値を取得

繰り返しフィールドの値を取得する方法は 2 つある。大きな差は認められなかったが、GetRepetition 関数の方が若干、速いようである。

GetRepetition ( Data::Field ; $j )

Data::Field [ $j ]

画像10

画像11



注意

速度や、シンプルさだけが正義ではなく、分かりやすさ、組織としての方針の遵守がとても大切になる。

一度作ったルールをコロコロ変更すると、「混沌」としたシステムになりがち。「誰々がこう言っていたから」とかいう理由で安易に真似をすると、思わぬ落とし穴に落ちたりする。

「初心者がスッと入りやすいルール」を作ることがとても大切だと思う。

定期的に「自分ルール」を見直して、より良いバランスのものにして行けたら、と思っております。


この記事が気に入ったらサポートをしてみませんか?