Office アドインのリソースの制限とパフォーマンスの最適化

ユーザーに最適なエクスペリエンスを作成するには、Office アドインが CPU コアとメモリ使用量、信頼性、Outlook アドインの正規表現評価の応答時間に関する特定の制限内で実行されるようにします。 これらのランタイム リソースの使用制限は、Windows および OS X 上の Office クライアントで実行されているアドインには適用されますが、モバイル アプリやブラウザーでは適用されません。

また、デスクトップやモバイル デバイス上のアドインについても、アドインの設計と実装でリソース使用量を最適化することによって、そのパフォーマンスを最適化できます。

アドインのリソース使用量の制限

実行時リソースの使用制限は、すべての種類の Office アドインに適用されます。これらの制限は、ユーザーのパフォーマンスを確保し、サービス拒否攻撃を軽減するのに役立ちます。 可能な範囲のデータを使用して、対象の Office アプリケーションで Office アドインをテストし、次の実行時の使用制限に対してそのパフォーマンスを測定してください。

  • CPU コアの使用率: 単一の CPU コアの使用率しきい値 90%、既定の 5 秒間隔で 3 回観測。

    Office クライアントが CPU コア使用率をチェックする既定の間隔は、5 秒ごとにです。 Office クライアントは、アドインの CPU コア使用率がしきい値を超えていると検出すると、ユーザーがアドインの実行を続行するかどうかを確認するメッセージを表示します。 ユーザーが続行を選択した場合、Office クライアントは、その編集セッション中にユーザーに再度要求しません。 ユーザーが CPU を集中的に使用するアドインを実行する場合、この警告メッセージの表示を減らすには、管理者は AlertInterval レジストリ キーを使用する必要がある可能性があります。

  • メモリ使用量: デバイスの利用可能な物理メモリに基づいて動的に決定される、既定のメモリ使用量しきい値。

    既定では、デバイス上の物理メモリ使用量が使用可能なメモリの 80% を超えていると Office クライアントが検出すると、クライアントはアドインのメモリ使用量、コンテンツおよび作業ウィンドウ アドインのドキュメント レベル、Outlook アドインのメールボックス レベルでの監視を開始します。既定の間隔 5 秒で、ドキュメントまたはメールボックス レベルでのアドインのセットの物理メモリ使用量が 50% を超える場合、クライアントはユーザーに警告します。 このメモリ使用量制限では、仮想メモリではなく物理メモリを使用して、タブレットなどの RAM が制限されたデバイスでのパフォーマンスを確保します。 管理者は、 MemoryAlertThreshold Windows レジストリ キーをグローバル設定として使用することで、この動的設定を明示的な制限でオーバーライドできます。ir は、 AlertInterval キーをグローバル設定として使用してアラート間隔を調整します。

  • クラッシュ許容度: 既定の制限は、1 つのアドインにつき 4 回。

    管理者は、RestartManagerRetryLimit レジストリ キーを使用して、クラッシュのしきい値を調整できます。

  • アプリケーションのブロッキング: アドインが応答しないままになる時間のしきい値は 5 秒間。

    これは、アドインと Office アプリケーションのユーザーエクスペリエンスに影響します。 この場合、Office アプリケーションはドキュメントまたはメールボックスのすべてのアクティブなアドイン (該当する場合) を自動的に再起動し、どのアドインが応答しなくなったかをユーザーに警告します。 アドインが時間のかかるタスクを実行していて定期的に処理を発生させないときに、このしきい値に到達する場合があります。 ブロッキングが発生しないようにする手法があります。 管理者は、このしきい値を上書きすることはできません。

Outlook アドイン

Outlook アドインが CPU コアまたはメモリ使用量の前のしきい値、またはクラッシュの許容範囲を超えた場合、アドインは使用できなくなります。 Exchange 管理 センターにアドインの状態が表示されます。

注:

Outlook on Windows と Mac でのみリソースの使用状況を監視しますが、これらのクライアントのいずれかが Outlook アドインを使用できなくなった場合、そのアドインは、Outlook on the web、モバイル デバイス、および新しい Outlook on Windows (プレビュー) でも使用できなくなります。

Outlook アドインでは、CPU コア、メモリ、信頼性の規則に加えて、アクティブ化に関する次の規則を遵守する必要があります。

  • 正規表現の応答時間: Outlook で Outlook アドインのマニフェスト内のすべての正規表現を評価する時間の既定のしきい値は 1,000 ミリ秒。 このしきい値を超えると、Outlook は後で評価を再試行します。

    管理者は、Windows レジストリでグループ ポリシーまたはアプリケーション固有の設定として OutlookActivationAlertThreshold 設定を使用して、この 1,000 ミリ秒の既定のしきい値を調節できます。

  • 正規表現の再評価: Outlook でマニフェスト内の正規表現を再評価する既定の制限は 3 回。 該当するしきい値 (既定値の 1,000 ミリ秒、または OutlookActivationAlertThreshold で指定された値のいずれか) を超えて評価が 3 回すべて失敗した場合、その設定が Windows レジストリに存在する場合、Outlook はアドインを使用できなくなります。 Exchange 管理 センターにはアドインの状態が表示され、Outlook on Windows (クラシックおよび新規 (プレビュー)、Mac、Web、モバイル デバイスではアドインを使用できません。

    管理者は、Windows レジストリでグループ ポリシーまたはアプリケーション固有の設定として OutlookActivationManagerRetryLimit 設定を使用して、評価を再試行するこの回数を調節できます。

Excel アドイン

Excel アドインをビルドする場合は、ブックを操作するときに、次のサイズ制限に注意してください。

  • Excel on the web ではペイロードのサイズが要求と応答で 5 MB に制限されています。 その制限を超えると、RichAPI.Error がスローされます。
  • 取得操作の範囲は 500 万セルに制限されています。

ユーザー入力がこれらの制限を超えると予想される場合は、 を呼び出すcontext.sync()前にデータを必ずチェックしてください。 必要に応じて、操作をより小さな部分に分割します。 各サブ操作を必ず呼び出 context.sync() して、それらの操作が再びバッチ処理されないようにしてください。

通常、これらの制限は大きな範囲で超えています。 アドインで RangeAreas を使用して、より大きな範囲内のセルを戦略的に更新できる場合があります。 の RangeAreas操作の詳細については、「 Excel アドインで複数の範囲を同時に操作する」を参照してください。Excel でのペイロード サイズの最適化の詳細については、「 ペイロード サイズ制限のベスト プラクティス」を参照してください。

作業ウィンドウ アドインとコンテンツ アドイン

コンテンツまたは作業ウィンドウ アドインが、CPU コアまたはメモリ使用量の上記のしきい値、またはクラッシュの許容範囲を超えた場合、対応する Office アプリケーションにユーザーに対する警告が表示されます。 この時点で、ユーザーは次のどちらかの処理を実行できます。

  • アドインを再起動します。
  • そのしきい値を超えることに関するその他のアラートを取り消します。 理想的には、ユーザーはドキュメントからアドインを削除する必要があります。アドインを続行すると、パフォーマンスと安定性の問題がさらに高まる可能性があります。

テレメトリ ログでリソースの使用状況の問題を確認する

Office には、Office アドインでのリソースの使用に関する問題も含めて、ローカル コンピューター上で実行される Office ソリューションの一定のイベント (読み込む、開く、閉じる、およびエラー) の記録を保守するテレメトリ ログが用意されています。 テレメトリ ログを設定している場合は、Excel を使用して、ローカル ドライブの次の既定の場所でテレメトリ ログを開くことができます。

%Users%\<Current user>\AppData\Local\Microsoft\Office\16.0\Telemetry

それぞれのアドインについてテレメトリ ログで追跡されるイベントごとに、そのイベントの発生日付/時刻、イベント ID、重大度、および短い説明的なタイトル、そのアドインのフレンドリ名と ID、イベントをログに記録したアプリケーションが記入されています。 テレメトリ ログをリフレッシュすれば、現在の追跡済みイベントを確認できます。 次の表は、テレメトリ ログで追跡された Outlook アドインの例を示しています。

日付/時刻 イベント ID 重要度 タイトル File ID アプリケーション
2022 年 10 月 8 日午後 5:57:10 7 該当なし アドインのマニフェストが正常にダウンロードされました 重要人物 69cc567c-6737-4c49-88dd-123334943a22 Outlook
2022 年 10 月 8 日午後 5:57:01 7 該当なし アドインのマニフェストが正常にダウンロードされました LinkedIn 333bf46d-7dad-4f2b-8cf4-c19ddc78b723 Outlook

次の表は、通常、Office アドインについてテレメトリ ログで追跡されるイベントを示しています。

イベント ID タイトル 重要度 説明
7 アドインのマニフェストが正常にダウンロードされました 該当なし Office アドインのマニフェストが正常に読み込まれ、Office アプリケーションによって読み取られました。
8 アドインのマニフェストがダウンロードされませんでした 重大 Office アプリケーションは、SharePoint カタログ、企業カタログ、または AppSource から 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 回の操作で処理するデータ量を小さくし、1 回の操作ですべてのデータを読み取ることがないようにします。 これを行うには、グローバル オブジェクトの setTimeout メソッドを使用して、入力と出力の期間を制限します。 It also handles the data in defined chunks instead of randomly unbounded data. もう 1 つのオプションは、 async を使用して Promise を処理することです。

  • アドインで CPU 使用率の高いアルゴリズムを使用して大量のデータを処理する場合は、Web Workers を使用してバックグラウンドで時間のかかるタスクを実行しつつ、フォアグラウンドで別のスクリプト (ユーザー インターフェイスへの進行状況の表示など) を実行できます。 Web Workers は、ユーザー アクティビティをブロックせず、HTML ページの応答性を維持します。 Web Workers の例については、「 ウェブ ワーカーの基本」を参照してください。 Web Worker API の詳細については、「Web Workers」を参照してください。

  • アドインで CPU 使用率の高いアルゴリズムを使用しているが、データの入出力を小さなセットに分割できる場合は、Web サービスの作成を検討します。データを Web サービスに渡して CPU の負荷をオフロードし、非同期コールバックを待機します。

  • 想定する最大量のデータでアドインをテストして、アドインにおける処理をその最大量までに制限します。

アプリケーション固有の API を使用したパフォーマンスの向上

アプリケーション固有 API モデルの使用」のパフォーマンスに関するヒントは、Excel、OneNote、Visio、およびWordのアプリケーション固有 API を使用する場合のガイダンスを提供します。 要約すると、次の手順を実行する必要があります。

不要なプロキシ オブジェクトの追跡を解除する

プロキシ オブジェクト は、呼び出されるまで 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();
});

オブジェクトの追跡を解除する必要があるのは、何千ものオブジェクトを処理する場合にのみ重要になることに注意してください。 ほとんどのアドインでは、プロキシ オブジェクトの追跡を管理する必要はありません。

関連項目