品質アドインは、CPU コア使用率、メモリ使用量、信頼性、および Outlook アドインの正規表現評価応答時間に関する特定の要件内で実行する必要があります。 このような制限は、ユーザーのパフォーマンスの向上およびサービス拒否攻撃の影響緩和にも役立ちます。 可能な範囲のデータを使用して、対象の Office アプリケーションで Office アドインをテストし、次の実行時の使用制限に対してそのパフォーマンスを測定してください。
アドインのリソース使用量の制限
注:
このセクションのリソース制限は、Excel、Outlook on Mac (クラシック)、PowerPoint、Wordにのみ適用されます。
次のランタイム リソース制限は、Windows と Mac の Office クライアントで実行されているアドインには適用されますが、モバイル アプリやブラウザーでは適用されません。
CPU コア使用率 - 1 つの CPU コア使用率しきい値 90% で、既定では 5 秒間隔で 3 回観察されます。
Office クライアントは、アドインの CPU コア使用率がしきい値を超えていると検出すると、ユーザーがアドインの実行を続行するかどうかを確認するメッセージを表示します。 ユーザーが続行を選択した場合、Office クライアントは、その編集セッション中にユーザーに再度要求しません。 Office クライアントが CPU コア使用率をチェックする既定の間隔は、5 秒ごとにです。 管理者は 、AlertInterval レジストリ キーを使用してしきい値を上げて、ユーザーが CPU を集中的に使用するアドインを実行する場合に、この警告メッセージの表示を減らすことができます。
メモリ使用量: デバイスの利用可能な物理メモリに基づいて動的に決定される、既定のメモリ使用量しきい値。
既定では、デバイス上の物理メモリ使用量が使用可能なメモリの 80% を超えていると Office クライアントが検出すると、クライアントはアドインのメモリ使用量の監視を開始します。 これは、コンテンツ アドインと作業ウィンドウ アドインのドキュメント レベルと、Outlook アドインのメールボックス レベルで行われます。既定の 5 秒間隔で、ドキュメントレベルまたはメールボックス レベルのアドインセットの物理メモリ使用量が 50% を超える場合、クライアントはユーザーに警告します。 このメモリ使用量制限では、仮想メモリではなく物理メモリを使用して、タブレットなどの RAM が制限されたデバイスでのパフォーマンスを確保します。 管理者は、 MemoryAlertThreshold Windows レジストリ キーをグローバル設定として使用することで、この動的設定を明示的な制限でオーバーライドできます。 AlertInterval キーを使用してアラート間隔を調整することもできます。
クラッシュの許容 - ドキュメントのセッション中にクラッシュする既定の制限は 4 です。
管理者は、RestartManagerRetryLimit レジストリ キーを使用して、クラッシュのしきい値を調整できます。
アプリケーションのブロック - 5 秒の長時間の応答不能しきい値。
これは、アドインと Office アプリケーションのユーザーエクスペリエンスに影響します。 これが発生すると、Office アプリケーションはドキュメントまたはメールボックスのすべてのアクティブなアドイン (該当する場合) を自動的に再起動し、応答しなくなったアドインをユーザーに警告します。 アドインは、実行時間の長いタスクの実行中に処理を定期的に生成しない場合に、このしきい値に達します。 この記事の後半には、アドインが Office アプリケーションをブロックしないようにするための手法が記載されています。 管理者は、このしきい値を上書きすることはできません。
注:
リソースの使用状況は Outlook on Mac (クラシック) でのみ監視されますが、クライアントで Outlook アドインが使用できなくなった場合、そのアドインは他のサポートされている Outlook クライアントでも使用できなくなります。
作業ウィンドウ アドインとコンテンツ アドイン
コンテンツまたは作業ウィンドウ アドインが、CPU コアまたはメモリ使用量の上記のしきい値、またはクラッシュの許容範囲を超えた場合、対応する Office アプリケーションにユーザーに対する警告が表示されます。 この時点で、ユーザーは次のどちらかの処理を実行できます。
- アドインを再起動します。
- そのしきい値を超えることに関するその他のアラートを取り消します。 理想的には、ユーザーはドキュメントからアドインを削除する必要があります。 アドインを継続的に使用すると、パフォーマンスと安定性の問題がさらに発生する可能性があります。
Outlook アドインの正規表現の評価応答時間
正規表現を使用し、Outlook on Windows (クラシック) または Mac (クラシック) で実行する Outlook アドインは、アクティブ化に関する次の規則を遵守する必要があります。
正規表現の応答時間: Outlook で Outlook アドインのマニフェスト内のすべての正規表現を評価する時間の既定のしきい値は 1,000 ミリ秒。 このしきい値を超えると、Outlook は後で評価を再試行します。
Windows 上の従来の Outlook では、管理者は、Windows レジストリの
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\WEF\Outlook\ActivationAlertThresholdDWORD 値にグループ ポリシーまたはアプリケーション固有の設定を使用して、この既定のしきい値である 1,000 ミリ秒を調整できます。正規表現の再評価: Outlook でマニフェスト内の正規表現を再評価する既定の制限は 3 回。 評価が 3 回失敗した場合、ユーザーは別のメール アイテムに切り替え、再試行評価に戻る必要があります。
管理者は、この回数を調整して、グループ ポリシーまたはアプリケーション固有の設定を使用して評価を再試行できます。 設定の場所はプラットフォームによって異なります。
-
Windows: Windows レジストリの
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\WEF\Outlook\ActivationRetryLimitDWORD 値。 -
Mac:
~/Library/PreferencesのActivationRetryLimitプロパティ リスト。
-
Windows: Windows レジストリの
Excel アドイン
Excel アドインには、ブックを操作するときの重要なデータ転送制限があります。
- Excel on the web ではペイロードのサイズが要求と応答で 5 MB に制限されています。 その制限を超えると、
RichAPI.Errorがスローされます。 - 範囲は、読み取り操作で 5,000,000 セルに制限されます。
ユーザー入力がこれらの制限を超えると予想される場合は、context.sync()を呼び出す前にデータをチェックします。 必要に応じて、操作をより小さな部分に分割します。 サブ操作ごとに context.sync() を呼び出して、それらの操作が再度バッチ処理されないようにします。
通常、これらの制限は大きな範囲で超えています。 アドインで RangeAreas を使用して、より大きな範囲内のセルを戦略的に更新できる場合があります。
RangeAreasの操作の詳細については、「Excel アドインで複数の範囲を同時に操作する」を参照してください。Excel でのペイロード サイズの最適化の詳細については、「ペイロード サイズ制限のベスト プラクティス」を参照してください。
テレメトリ ログでリソースの使用状況の問題を確認する
Office には、ローカル コンピューターで実行されている Office ソリューションの特定のイベント (読み込み、開く、閉じる、エラー) の記録を保持するテレメトリ ログが用意されています。 これには、Office アドインでのリソースの使用に関する問題が含まれます。 テレメトリ ログを設定している場合は、Excel を使用して、ローカル ドライブの次の既定の場所でテレメトリ ログを開くことができます。
%Users%\<Current user>\AppData\Local\Microsoft\Office\16.0\Telemetry
それぞれのアドインについてテレメトリ ログで追跡されるイベントごとに、そのイベントの発生日付/時刻、イベント ID、重大度、および短い説明的なタイトル、そのアドインのフレンドリ名と ID、イベントをログに記録したアプリケーションが記入されています。 テレメトリ ログを更新して、現在追跡されているイベントを確認します。
次の表に、テレメトリ ログで Office アドイン用に追跡されるイベントの一覧を示します。
| イベント ID | タイトル | 重要度 | Description |
|---|---|---|---|
| 7 | アドインのマニフェストが正常にダウンロードされました | 該当なし | Office アドインのマニフェストが正常に読み込まれ、Office アプリケーションによって読み取られました。 |
| 8 | アドインのマニフェストがダウンロードされませんでした | 重大 | Office アプリケーションは、SharePoint カタログ、企業カタログ、または Microsoft Marketplace から Office アドインのマニフェスト ファイルを読み込むことができませんでした。 |
| 9 | アドインのマークアップを解析できませんでした | 重大 | Office アプリケーションは Office アドイン マニフェストを読み込みましたが、アプリの HTML マークアップを読み取れませんでした。 |
| 10 | アドインの CPU 使用率が高すぎます | 重大 | Office アドインは、限定された時間内に CPU リソースの 90% 超を使用しました。 |
| 15 | アドインは文字列検索のタイムアウトのため無効になっています | 該当なし | Outlook アドインは電子メールの件名とメッセージを検索して、それらを正規表現で表示するかどうかを決定します。 [File] 列に記された Outlook アドインは、正規表現での一致を試みている最中に繰り返しタイムアウトしたため、Outlook によって無効にされました。 |
| 18 | アドインは正常に終了しました | 該当なし | Office アプリケーションは Office アドインを正常に閉じることができました。 |
| 19 | アドインで実行時エラーが発生しました | 重大 | Office アドインに、エラーの原因となる問題がありました。 詳細については、エラーが発生したコンピューター上で Windows イベント ビューアーを使用して Microsoft Office Alerts ログを確認してください。 |
| 20 | アドインでライセンスを確認できませんでした | 重大 | Office アドインのライセンス情報を確認できないか、有効期限が切れている可能性があります。 詳細については、エラーが発生したコンピューター上で Windows イベント ビューアーを使用して Microsoft Office Alerts ログを確認してください。 |
詳細については、「テレメトリ ダッシュボードを展開する」および「テレメトリ ログを使用した Office ファイルおよびカスタム ソリューションのトラブルシューティング」を参照してください。
設計および実装上のテクニック
リソースの CPU 使用率とメモリ使用量、クラッシュ許容度、UI の応答性に関する制限は Office デスクトップ クライアントでのみ実行されている Office アドインに適用されますが、アドインをサポートするすべてのクライアントとデバイスで適切に実行する場合は、最適化を優先する必要があります。 アドインで長時間実行される処理があったり、大規模なデータ セットを処理したりする場合は、最適化が特に重要です。 次の一覧では、CPU を集中的に使用する操作またはデータを集中的に使用する操作を小さなチャンクに分割して、アドインが過剰なリソース消費を回避し、Office アプリケーションの応答性を維持する手法をいくつか示します。
アドインが無制限のデータセットから大量のデータを読み取る必要がある場合は、1 回の操作で読み取りを完了するのではなく、テーブルからデータを読み取るときにページングを適用するか、短い読み取り操作ごとにデータのサイズを小さくすることができます。 これを行うには、グローバル オブジェクトの setTimeout メソッドを使用して、入力と出力の期間を制限します。 It also handles the data in defined chunks instead of randomly unbounded data. もう 1 つのオプションは、 async を使用して Promise を処理することです。
アドインで CPU を集中的に使用するアルゴリズムを使用して大量のデータを処理する場合は、 Web worker を 使用してバックグラウンドで実行時間の長いタスクを実行し、ユーザー インターフェイスで進行状況を表示するなど、フォアグラウンドで別のスクリプトを実行できます。 Web ワーカーはユーザー アクティビティをブロックせず、HTML ページの応答性を維持できます。 Web Workers の例については、「 ウェブ ワーカーの基本」を参照してください。
アドインで CPU を集中的に使用するアルゴリズムを使用しているが、データ入力または出力をより小さなセットに分割できる場合は、Web サービスの作成、WEB サービスへのデータの渡しによる CPU のオフロード、非同期コールバックの待機を検討してください。
想定する最大量のデータでアドインをテストして、アドインにおける処理をその最大量までに制限します。
アプリケーション固有の API を使用したパフォーマンスの向上
「アプリケーション固有 API モデルの使用」のパフォーマンスに関するヒントは、Excel、OneNote、Visio、およびWordのアプリケーション固有 API を使用する場合のガイダンスを提供します。 要約すると、次の手順を実行する必要があります。
- 必要なプロパティのみを読み込みます。
-
sync() 呼び出しの数を最小限に抑えます。 コードで
sync呼び出しを管理する方法の詳細については、「ループでの context.sync メソッドの使用を避ける」を参照してください。 - 作成されるプロキシ オブジェクトの数を最小限に抑えます。 次のセクションで説明するように、プロキシ オブジェクトの追跡を解除することもできます。
不要なプロキシ オブジェクトの追跡を解除する
プロキシ オブジェクト は、 RequestContext.sync() が呼び出されるまでメモリ内に保持されます。 大規模なバッチ操作では、アドインが 1 回のみ必要とするプロキシ オブジェクトが大量に生成されることがあります。それらのオブジェクトは、バッチの実行前にメモリから解放できます。
untrack() メソッドは、オブジェクトをメモリから解放します。 このメソッドは、多くのアプリケーション固有の API プロキシ オブジェクトに実装されています。 オブジェクトを使用してアドインを実行した後に untrack() を呼び出すと、多数のプロキシ オブジェクトを使用する場合に顕著なパフォーマンス上の利点が得られます。
注:
Range.untrack() は、ClientRequestContext.trackedObjects.remove(thisRange) のショートカットです。 プロキシ オブジェクトは、コンテキスト内の追跡対象オブジェクト リストから削除することで追跡解除できます。
次の Excel コード サンプルでは、選択した範囲にデータ (一度に 1 つのセル) を入力します。 セルに値が追加されると、そのセルを表している範囲の追跡が解除されます。 10,000 から 20,000 個のセルの範囲を選択して、このコードを実行します。最初の実行では cell.untrack() の行を使用し、その後でこの行を削除して実行します。
cell.untrack() の行がないコードよりも、この行があるコードの方が高速になることがわかります。 また、クリーンアップの手順にかかる時間が短くなるため、その後の応答時間も速くなることがわかります。
Excel.run(async (context) => {
const largeRange = context.workbook.getSelectedRange();
largeRange.load(["rowCount", "columnCount"]);
await context.sync();
for (let i = 0; i < largeRange.rowCount; i++) {
for (let j = 0; j < largeRange.columnCount; j++) {
let cell = largeRange.getCell(i, j);
cell.values = [[i *j]];
// Call untrack() to release the range from memory.
cell.untrack();
}
}
await context.sync();
});
オブジェクトの追跡を解除する必要があるのは、何千ものオブジェクトを処理する場合にのみ重要になることに注意してください。 ほとんどのアドインでは、プロキシ オブジェクトの追跡を管理する必要はありません。
関連項目
Office Add-ins