On 04/03/2013 06:46 PM, Hans-Peter Jansen wrote:
Which graphic driver do you use? (that doesn't tell us much, since the C++
version behave with the same driver, just for the record..)
xf86-video-intel 2.21.5-1
intel-dri 9.1.1-1
Might be worth to compare the C++ version (that you should publish here¹)
and the Python versions with perf. Of course, they differ...
Attached.
python versions, perf running for about 10 sec.
QT_GRAPHICSSYSTEM=raster perf record -f python graphicsviewtest.py
[...]
QT_GRAPHICSSYSTEM=opengl perf record -f python graphicsviewtest.py
[...]
The former looks nice, it's a great example, why PyQt rocks. The hottest
areas are there, where they should be: down under, moving bits. Great.
But the latter looks strange indeed.
Phil, do you have any idea, why PyEval_EvalFrameEx is the top sucker in
this scenario? This looks, like in opengl mode, it is evaluating some
python expression in its hottest path (data type conversions or the like?).
My raster perf report doesn't look nice at all:
14.30% python2 libpython2.7.so.1.0 [.] PyEval_EvalFrameEx
9.39% python2 libQtGui.so.4.8.4 [.] 0x00000000001bf673
8.99% python2 sip.so [.] 0x000000000000b086
6.10% python2 libpython2.7.so.1.0 [.] lookdict_string
4.02% python2 libpython2.7.so.1.0 [.] PyDict_GetItem
3.94% python2 libpython2.7.so.1.0 [.] _PyType_Lookup
3.01% python2 libm-2.17.so [.] 0x00000000000105e0
2.27% python2 libm-2.17.so [.] feraiseexcept
2.23% python2 libpython2.7.so.1.0 [.] _PyObject_GenericGetAttrWithDict
1.71% python2 libpython2.7.so.1.0 [.] binary_op1
1.50% python2 libpython2.7.so.1.0 [.] PyType_IsSubtype
1.40% python2 libpython2.7.so.1.0 [.] PyErr_Restore
1.33% python2 QtGui.so [.] 0x000000000036120b
1.27% python2 libpython2.7.so.1.0 [.] PyObject_Malloc
1.19% python2 libc-2.17.so [.] malloc
Same thing but even worse with opengl:
15.49% python2 i965_dri.so [.] 0x000000000003ae99
6.08% python2 libpython2.7.so.1.0 [.] PyEval_EvalFrameEx
5.96% python2 libdrm_intel.so.1.0.0 [.] 0x0000000000007468
5.60% python2 libQtOpenGL.so.4.8.4 [.] 0x0000000000031262
4.96% python2 sip.so [.] 0x000000000000b055
4.32% python2 libdricore9.1.1.so.1.0.0 [.] 0x00000000001ea2b4
2.76% python2 libpython2.7.so.1.0 [.] lookdict_string
2.11% python2 libpython2.7.so.1.0 [.] PyDict_GetItem
1.95% python2 libpython2.7.so.1.0 [.] _PyType_Lookup
1.42% python2 libm-2.17.so [.] 0x00000000000105c0
1.32% python2 libc-2.17.so [.] __memcmp_sse4_1
1.03% python2 libc-2.17.so [.] _int_malloc
1.01% python2 libm-2.17.so [.] feraiseexcept
0.93% python2 libc-2.17.so [.] __memcpy_ssse3_back
In both cases, PyEval_EvalFrameEx is at or near the top, and so are other
Python things.
For the sake of completeness, here's the perf output for the C++ version (which
runs perfectly):
43.56% graphicsviewtes libQtGui.so.4.8.4 [.] 0x00000000001c0bb2
q
20.58% graphicsviewtes libm-2.17.so [.] feraiseexcept
15.48% graphicsviewtes libm-2.17.so [.] 0x0000000000015622
4.47% graphicsviewtes graphicsviewtest [.]
SignalItem::paint(QPainter*, QStyleOptionGraphicsItem
3.09% graphicsviewtes libQtGui.so.4.8.4 [.] QPen::dashPattern()
const
1.17% graphicsviewtes libQtGui.so.4.8.4 [.] QTransform::map(QPointF
const&) const
0.77% graphicsviewtes libc-2.17.so [.] free
0.72% graphicsviewtes libQtGui.so.4.8.4 [.]
QPainter::drawLines(QLine const*, int)
0.46% graphicsviewtes libpthread-2.17.so [.]
__pthread_mutex_unlock_usercnt
0.45% graphicsviewtes libpthread-2.17.so [.] pthread_mutex_lock
I tested this program on openSUSE (in a VirtualBox), and in contrast to
Vincent, it doesn't work for me there either (same behavior as in my native
Arch Linux). BTW, I use KDE and not Gnome, but I doubt that this is relevant.
Furthermore, I still have the same bad behavior on my Mac.
Clemens
#include <QGraphicsItem>
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QTime>
#include <QScrollBar>
#include <QDebug>
#include <QStyleOptionGraphicsItem>
#include <math.h>
class SignalItem : public QGraphicsItem
{
public:
SignalItem(int nr)
{
setFlags(QGraphicsItem::ItemUsesExtendedStyleOption);
nr_ = nr;
fr_ = 20;
bg_ = Qt::white;
}
QRectF boundingRect() const
{
return QRectF(0, nr_*50, 10000, 50);
}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0)
{
painter->fillRect(option->exposedRect, bg_);
float prevY = sin((int(option->exposedRect.left()) - 1)/fr_)*10 + 25 + nr_*50;
for (int x = int(option->exposedRect.left()); x < int(option->exposedRect.right()); x++) {
float y = sin(x/fr_)*10 + 25 + nr_*50;
painter->drawLine(x-1, prevY, x, y);
prevY = y;
}
}
private:
int nr_;
float fr_;
QColor bg_;
};
class Dummy : public QObject
{
public:
Dummy()
{
scene_ = new QGraphicsScene();
for (int i=0; i < 40; i++)
scene_->addItem(new SignalItem(i));
view_ = new QGraphicsView(scene_);
view_->show();
startTimer(25);
x_ = 0;
}
void timerEvent(QTimerEvent* event)
{
x_ += 5;
view_->horizontalScrollBar()->setValue(x_);
QTime currentTime = QTime::currentTime();
if (lastTimerEvent_.isValid())
qDebug() << lastTimerEvent_.msecsTo(currentTime);
lastTimerEvent_ = currentTime;
}
private:
QGraphicsScene* scene_;
QGraphicsView* view_;
QTime lastTimerEvent_;
int x_;
};
int main(int argc, char* argv[])
{
QApplication* app = new QApplication(argc, argv);
Dummy* d = new Dummy();
return app->exec();
}
######################################################################
# Automatically generated by qmake (2.01a) Tue Mar 19 14:38:49 2013
######################################################################
TEMPLATE = app
CONFIG += console
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
SOURCES += graphicsviewtest.cpp
_______________________________________________
PyQt mailing list [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt