データ ソースでパフォーマンスを向上させる

完了

前のユニットでは、多くの場合、データ ソースがアプリのパフォーマンスの低下の主な理由であることを学習しました。 このユニットでは、これらのパフォーマンスの問題を軽減するために適用できる、一般的ないくつかの手法について学習します。

コレクションを使用してデータをキャッシュする

アプリでは多くの場合、ドロップダウン メニューの部門のリストをプルする場合と同様、同じデータのクエリを繰り返し実行します。 それらのインスタンスでは、データのクエリを一度実行してから、アプリ全体でそのデータを再利用することができます。 これにより、ネットワーク経由でのデータ ソースへの反復的な呼び出しが減ります。 このプロセスの例を以下に示します。

アプリにはいくつかの画面が表示され、そこで部門を選択するためのドロップダウン メニューを提供します。 部署のリストは、DepartmentListという名前のテーブル内の Microsoft Dataverse の中にあります。 メニューの各インスタンスでは、次の式を使用します。

Filter(DepartmentList, Status = "Active")

これは問題なく動作して実行されます。

アプリの完了時に、DepartmentList テーブルのクエリを複数回実行していることがわかります。これは静的な情報である場合でも同様です。 以下の式を使用し、情報を格納するアプリの OnStart プロパティを指定して、コレクションを作成するようにアプリを変更することができます。

Collect(collectDepartmentList, Filter(DepartmentList, Status = "Active"))

これでその情報を格納しました。ドロップダウン コントロールの Items プロパティを、Filter(DepartmentList, Status = "Active") ではなく、collectDepartmentList に変更できます。 これらの小さな変更によって、アプリでのパフォーマンスが向上することになります。 また、手法についてよく理解すれば、この方法で最初からアプリを構築し、記述して維持する必要がある式の数を減らすことができます。

委任に注意する

1 つ注意すべきなのは、Collect 関数は委任できないという点です。 つまり、既定では、最初の 500 個の項目のみがデータ ソースから返され、コレクションに格納されます。 アプリでコレクションの使用を実装する際には、必ず、この制限について計画してください。

委任もパフォーマンスに影響する

委任 について学習したときに、データ ソースの適切な数の行を返すことに重点を置きました。 特にモバイル アプリでは、委任がパフォーマンスに影響する可能性があることに注意することも重要です。

式でデータ ソースに委任する場合、すべての処理がデータ ソースによって処理され、ネットワーク経由で一致する行のみが表示されるアプリに返されます。 関数が委任できない場合、委任の制限を 2,000 行に変更するのが一般的です。 これは、最初の 2,000 行がネットワーク経由でダウンロードされてから、ローカルで処理されることを意味します。 携帯ネットワーク接続が遅い、またはローエンド モバイル デバイスを使用するシナリオでは、この処理にかなりの時間がかかり、ユーザーのエクスペリエンスが低下する可能性があります。

可能な限り、委任できる関数のみを使用するようにしてください。 関数が委任できない場合は、エンド ユーザーに対する影響について計画してください。

Concurrent 関数を使用して複数のデータ ソースを読み込む

これまで、コレクションを使用するアプリでのデータのキャッシュについて学習しました。 アプリでその機能を実装する場合、アプリの起動時にいくつかのコレクションを読み込むことはよくあります。 OnStart プロパティは次のようになります。

Collect(collectDepartmentList, Filter(DepartmentList, Status =
"Active")); Collect(collectCompanyList,
CompanyList);Collect(collectRegions, RegionList)

この例では、3 つのコレクションを作成しますが、コレクションが処理されるのは一度に 1 つとなります。 したがって、それぞれの処理に 3 秒かかる場合、ユーザーはアプリが起動するまで 9 秒待機する必要があります。

Concurrent 関数では、それらのすべての呼び出しを同時に処理することができます。 コードを次のように変更することができます。

Concurrent(
Collect(collectDepartmentList, Filter(DepartmentList, Status = "Active")),
Collect(collectCompanyList, CompanyList),
Collect(collectRegions, RegionList)
)

これで、3 つの式がすべて同時に実行されます。 読み込み時間は 3 秒に短縮されます。 Concurrent は、非同期呼び出しでの長い遅延を回避するのに優れた方法です。

プレビュー機能と試験的な機能

Power Apps 内には、アプリで実装できる高度な他の機能があります。 メニュー バーのファイルを選択してから、アプリの設定詳細設定を選ぶことで、それらにアクセスできます。 表示されるオプションのリストは常に変わりますが、多くの場合、パフォーマンスに関連する 1 つまたは複数の機能があります。

プレビュー機能

プレビュー機能とは、十分にテストされ、もうすぐリリースされる機能のことです。 これらはまもなく、すべてのアプリで利用可能になります。 これらの機能をテストし、理解することは、標準となった場合に備えるのに役立ち、ほとんどは新しいアプリで既定で有効になります。

パフォーマンスを向上させるのに役立つ、現在のプレビュー機能の例として、遅延読み込みがあります。 この "オンデマンド画面での式の呼び出し設定によるアプリの起動時間の短縮" 機能では、ユーザーが画面にアクセスするまでその画面が処理されず、アプリの起動と実行時間が短縮されます。

試験的な機能

試験的な機能とは、随時、変更、中断、非表示となる可能性のある機能のことです。 既定では、機能は無効になっています。 ここでもパフォーマンス機能が見つかる可能性があるため、確認しておく価値があります。 しかし、機能は進化したり、完全に変わったり、あるいは非表示になる場合があるため、運用アプリに組み込むと、リスクが発生することに注意してください。

場合によっては、アプリのパフォーマンスに関連する機能が表示されることがあります。 有効化とテストはいつでも行うことができます。設定に戻ると無効にできます。

OnStart と OnVisible

OnStart と OnVisible は、優れたアプリを構築するためのツールキットの一部ですが、パフォーマンスの観点から、大きな影響を与える可能性があります。

  • OnStart - これはアプリ レベルのプロパティです。 このプロパティの式は、アプリの起動時に一度実行されるものであり、再度実行されることはありません。 アプリが開く前に、すべての式で処理する必要があります。 これは、アプリ全体で必要となるデータを初期化するためによく使用されます。

  • OnVisible - これは画面ごとのプロパティです。 このプロパティの式は、ユーザーが画面に移動するたびに実行されます。 式で処理が終了する前に、画面でレンダリングされます。

パフォーマンスの観点から、コードがいつ実行されるかが重要な考慮事項となります。 アプリの起動時、あるいは画面が表示されるたびに実行されます。 このモジュールで先ほど示した部門のコレクションが良い例です。 そのコードはアプリの OnStart プロパティに読み込まれます。 つまり、一度読み込まれると、常に利用可能となります。 OnStart から OnVisible にそのコードを移動すると、コレクションの利点が失われます。 式が OnVisible プロパティにあった場合、ユーザーが画面に移動するたびに、データ ソースのクエリが実行されます。 その場合、ドロップ ダウンのコードをそのままにしておく場合でも同様に実行されます。

これは、OnVisible を使用できないという意味ではありません。 OnVisible は、実行する必要がある現在の画面に関連する式に適しています。 加えて、OnVisible は非ブロッキングです。 そのため、ユーザーは画面を表示するために式が完了するのを待機する必要はありません。これにより、空白の画面を表示するユーザー ニーズの量が減ります。

ほとんどのアプリでは、最適なエクスペリエンスを得るために、OnStart と OnVisible の組み合わせを使用します。

概要

このように、アプリを構築し、データ ソースとやり取りする方法には多くのオプションがあります。 このユニットのリストは完全なものではありません。 ここに示すガイダンスは、パフォーマンスを向上させるためのものですが、実際の結果は異なる場合があります。 アプリへのこれらの手法の適用を開始する際に、ご自分とご利用の環境に最適なものについて学習します。

次のユニットでは、テストおよびトラブルシューティングの手法について学習します。