Производительность функции XCreateGC - PullRequest
3 голосов
/ 30 сентября 2011

У меня проблема с производительностью функции 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);
}

Заранее спасибо.

1 Ответ

1 голос
/ 23 июля 2013

Ключом к производительности Xlib является понимание того, когда библиотеке нужно заблокировать ответ от X-сервера. Как правило, создание ресурса (например, GC) не требует блокировки; ID ресурса выделяется на стороне клиента, а запрос на создание просто ставится в очередь или отправляется без ожидания ответа. В то время, когда вызову Xlib в конечном итоге требуется ответ, он должен будет внезапно остановиться и дождаться завершения ВСЕХ запросов до этого момента, получить ответы на все ожидающие запросы и, наконец, получить ответ на вызов под рукой. Это заставит одну функцию Xlib выглядеть очень медленной, но на самом деле вы видите стоимость целой связки предыдущих функций, потенциально.

XCreateGC не должен блокировать ответы, насколько я знаю. Возможно ли, что он блокируется из-за полного буфера отправки? Возможно, у вас есть поток запросов, и в какой-то момент ваше приложение останавливается, пока оно блокирует полный буфер сокетов, пока X-сервер не сможет перехватить и прочитать больше запросов.

В любом случае, поскольку этот вопрос старый, вероятно, слишком поздно спрашивать подробности, но я думаю, что основной ответ заключается в том, что если вы используете профилировщик, то вызов функции Xlib может быть в стеке, когда Xlib фактически ожидает или испытывают последствия некоторых более ранних вызовов функций Xlib или просто огромное количество X запросов, которые вы делаете. Скорее всего, сам XCreateGC не является проблемой.

Еще одна эзотерическая причина ожидания X-сервера может заключаться в том, что другой клиент имеет захват сервера, который не позволяет серверу обрабатывать запросы от кого-либо еще.

Ключевыми стратегиями часто являются:

  1. уменьшить количество X запросов
  2. делайте как можно больше, прежде чем блокировать ответ (грубое правило: все, что называется XGetSomething, должно будет дождаться завершения всех ожидающих запросов, а затем собрать все ответы)

Это обычно основные проблемы, за исключением случаев, когда вы выполняете действительно тяжелую операцию, такую ​​как перемещение большого количества данных изображения, тогда одна операция может быть более важной, чем количество операций или циклическое блокировка отключения.

...