Nous sommes tombés sur un problème de performance avec les événements Quartz, et plus particulièrement avec CGEventPost : lors d'une forte charge GPU, CGEventPost peut se bloquer. Nous avons créé une petite application de référence pour démontrer le problème . Cette application est juste une boucle qui crée, affiche et libère des événements.
Vous pouvez voir ci-dessous les résultats de l'exécution de l'application. La première exécution se fait sur un système inactif. Le deuxième est avec FurMark (test de stress du GPU) avec les cadrans augmentés autant que possible.
- Inner est la durée de la boucle interne, c'est-à-dire la création, la publication et la diffusion d'un événement avec Quartz Events.
- Outer est le temps que notre programme attend pour être réveillé (un sommeil). Cette durée devrait être proche de celle de notre sommeil, mais si le système est sous pression, elle peut être retardée.
-
Post est le temps que prend le post de l'événement.
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
Ici, nous pouvons voir que l'affichage de l'événement prend environ 0,03 ms en moyenne. De plus, le fil de discussion semble être réveillé environ 0,5 ms trop tard. Pas de pics dans 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
Lorsque le système est soumis à une forte charge du GPU, l'affichage d'un événement peut prendre (pics) des millisecondes au lieu de microsecondes. En cas de stress extrême du GPU (< 1 FPS), cette valeur peut prendre des secondes. CGEventPost parfois semble attendre que le GPU termine son travail avant de revenir. Notre thread est toujours programmé normalement, sans retard ni pics notables (extérieur).
Toute idée est la bienvenue.