2

我对 XCreateGC 函数性能有疑问。似乎在某些情况下工作正常(快速),而在其他情况下则非常慢:)。有关更多详细信息,请查看此代码:

void some_function(int dx, int dy, int sx, int sy, int w, int h,
                Drawable src, Drawable mask, Drawable dest)
{
        Display *dpy = QX11Info::display();
        GC gc = XCreateGC(dpy, src, 0, 0);
        XSetClipOrigin(dpy, gc, dx - sx, dy - sy);
        XSetClipMask(dpy, gc, mask);
        XCopyArea(dpy, src, dest, gc, sx, sy, w, h, dx, dy);
        XFreeGC(dpy, gc);
}

提前致谢。

4

1 回答 1

2

Xlib 性能的关键是了解库何时需要阻止来自 X 服务器的回复。一般来说,创建资源(如GC)不需要阻塞;资源ID在客户端分配,创建请求只是排队或发送,无需等待回复。当一个 Xlib 调用最终需要回复时,它必须突然停止并等待所有请求完成,获得所有待处理的回复,最后获得手头调用的回复。这将使一个 Xlib 函数看起来超级慢,但实际上您可能会看到一大堆先前函数的成本。

不过,据我所知,XCreateGC 不应该阻止回复。由于发送缓冲区已满,它可能会阻塞?也许你有大量的请求,并且在某个时候你的应用程序在一个完整的套接字缓冲区阻塞时停止,直到 X 服务器可以赶上并读取更多请求。

无论如何,由于这个问题已经过时,询问细节可能为时已晚,但我认为基本答案是,如果您使用分析器,当 Xlib 实际等待或经历后果时,Xlib 函数调用可能在堆栈上一些较早的Xlib 函数调用,或者只是您正在发出的 X 请求的绝对数量。很可能 XCreateGC 本身不是问题。

等待 X 服务器的另一个深奥原因可能是另一个客户端有一个服务器抓取,这使服务器无法处理来自其他任何人的请求。

关键策略通常是:

  1. 减少 X 请求的数量
  2. 在阻止回复之前尽可能多地做(粗略的经验法则,任何称为 XGetSomething 的东西都必须等待所有待处理的请求完成,然后收集所有回复)

这些通常是主要问题,例外是当您执行一些真正繁重的操作(例如移动大量图像数据)时,单个操作可能比操作数或往返阻塞更重要。

于 2013-07-22T20:15:58.307 回答