Quartz Events、より具体的には CGEventPost のパフォーマンスの問題に遭遇しました。GPU の負荷が高い場合、CGEventPost がブロックされる可能性があります。この問題を実証するために、小さなベンチマーク アプリケーションを作成しました。このアプリケーションは、イベントを作成、投稿、およびリリースする単なるループです。
以下に、アプリケーションの実行結果を示します。最初の実行は、アイドル状態のシステムで行われます。2 回目の実行は、FurMark (GPU ストレス テスト) を使用して、ダイヤルを可能な限り上げたものです。
- Inner は内部ループにかかる時間です。基本的には、Quartz Events でイベントを作成、投稿、およびリリースするだけです。
- Outer は、プログラムが起動 (スリープ) するのを待っている時間です。私たちが寝る時間に近いはずですが、システムに圧力がかかっている場合は遅れる可能性があります.
- Post は、イベントの投稿にかかる時間です。
18:58:01.683 EventPerformance[4946:707] Measurements: (outer should be close to 10)
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.26, CGEventPost (ms): 0.03
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.06, outer (ms): 10.85, CGEventPost (ms): 0.05
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.41, CGEventPost (ms): 0.04
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 10.39, CGEventPost (ms): 0.03
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.05, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.03, outer (ms): 10.67, CGEventPost (ms): 0.03
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.08, outer (ms): 10.09, CGEventPost (ms): 0.05
18:58:01.688 EventPerformance[4946:707] Averages: (outer should be close to 10)
18:58:01.688 EventPerformance[4946:707] avg inner (ms): 0.05, avg outer (ms): 10.64, avg post (ms): 0.03
ここでは、イベントの送信に平均で約 0.03 ミリ秒かかることがわかります。また、スレッドの起動が約 0.5ms 遅すぎるようです。CGEventPost にスパイクはありません。
19:02:02.150 EventPerformance[5241:707] Measurements: (outer should be close to 10)
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.23, CGEventPost (ms): 0.02
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.54, CGEventPost (ms): 0.02
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 11.01, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.74, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.20, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 10.35, outer (ms): 11.01, CGEventPost (ms): 10.35
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.02, CGEventPost (ms): 0.02
19:02:02.153 EventPerformance[5241:707] inner (ms): 58.90, outer (ms): 10.11, CGEventPost (ms): 58.90
19:02:02.153 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.12, CGEventPost (ms): 0.02
19:02:02.153 EventPerformance[5241:707] Averages: (outer should be close to 10)
19:02:02.371 EventPerformance[5241:707] avg inner (ms): 7.71, avg outer (ms): 10.44, avg post (ms): 7.71
システムの GPU 負荷が高い場合、イベントの送信にマイクロ秒ではなくミリ秒かかることがあります。極端な GPU ストレス (< 1 FPS) では、この値に数秒かかることがあります。CGEventPost は、戻る前に GPU が何らかの作業を完了するのを待っているように見えることがあります。私たちのスレッドは、目立った遅延/スパイク (外側) なしで、通常どおりスケジュールされています。
どんなアイデアでも大歓迎です。