首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CGEventPost在图形处理器负载下的弱性能

CGEventPost在图形处理器负载下的弱性能
EN

Stack Overflow用户
提问于 2013-01-16 00:40:02
回答 1查看 1.5K关注 0票数 52

我们偶然发现了一个与Quartz事件有关的性能问题,更具体地说是CGEventPost:在繁重的GPU负载期间,GPU可能会阻塞。我们创建了a small benchmark application to demonstrate the issue。这个应用程序只是一个创建、发布和释放事件的循环。

下面您可以看到运行应用程序的结果。第一次运行是在空闲系统上。第二次运行是使用FurMark (图形处理器压力测试),尽可能调高刻度盘。

  • 内部是内部循环需要多长时间,基本上只是创建、发布和释放一个带有Quartz事件的事件。
  • 外部是我们的程序等待被唤醒(睡眠)的时间。应该接近我们的睡眠时间,但如果系统有压力,它可能会被延迟。
  • 帖子是事件帖子所需的时间。

代码语言:javascript
复制
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中没有尖峰。

代码语言:javascript
复制
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有时似乎在等待图形处理器完成一些工作后才会返回。我们的线程仍然被正常调度,没有明显的延迟/尖峰(外部)。

任何想法都是值得感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-20 07:16:34

我猜你正在填满队列(底层的mach端口)...

您可以使用Instruments中的"scheduling“或"system call”工具确认这一点。(创建一个新的空白文档,添加仪器,然后在File > Record Options...下确保选中了"deferred“。)这将显示应用程序中的所有线程活动(线程何时阻塞,何时休眠,何时激活,以及原因)。

我会首先尝试提高线程优先级(参见。调用CGEventPost的线程的man 3 PTHREAD_SCHEDPARAM)。如果你的线程在较低优先级的线程上被阻塞,内核应该临时提高阻塞线程的优先级,以避免优先级反转,并帮助你的任务更早完成。

总的来说,我认为您必须实现一个双线程解决方案,如下所示:

为要发布的事件创建一个队列。从您的主线程(或事件发布线程)向此队列发布事件,然后通知第二个线程(您创建的事件使用者线程)遍历队列并使用CGEventPost发布任何未完成的事件。

CGEventPost阻塞时,您的第二个事件发布线程将阻塞,但这不会阻塞任何其他线程。当CGEventPost最终解除阻塞时,它将使用您的事件消费者线程发布的任何未完成的事件,并且事件消费者线程可以恢复发布事件。

另一种可能性:你能联合事件吗?有一些特定类型的事件(鼠标移动?)你可以合并成更少的事件。您可能有时仍然会遇到CGEventPost的队列限制,我认为双线程方法可能是您最好的选择。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14342444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档