Speed Problem with Qchart and Drawing BarChart in Qt5.7



  • Hello to All
    I have serious problem with drawing Chart in Qt, I created the following simple project base on Qt Bar chart Sample project, My chart changes over time dynamically. My problem with it is, when I increase the number of bars the program is too slow and it takes a long time to drawing chart. I use a thread but it does not matter at all. So how can I increase the speed of drawing chart?

    #define BinNumber 100
    #define BinLenght   0.002
    unsigned long hist[BinNumber];
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
            QMainWindow window;
            window.show();
            QList<QBarSet*> Bins;
            QBarSeries *series;
            QChart *chart;
            QChartView *chartView;
            float deltaV = BinLenght / float(BinNumber);
            series = new QBarSeries();
            chart = new QChart();
            chart->setVisible(false);
            clock_t chartStart = clock();
            for (int i = 0; i < BinNumber; i++) {
                hist[i] = (int)qrand() % 1000;
                QBarSet * bar = new QBarSet(QString::number((i + 1)*deltaV));
                *bar << hist[i];
                Bins.append(bar);
    
                series->append(bar);
            }
            while (false)
            {
                int i = 0;
                hist[i] = 0;
                QBarSet * bar = new QBarSet(QString::number((i + 1)*deltaV));
                *bar << 0;
                Bins.append(bar);
    
                series->append(bar);
            }
            QValueAxis *axisX = new QValueAxis;
            axisX->setRange(0, 5);
            QValueAxis *axisY = new QValueAxis;
            axisY->setRange(0, 1000);
            chart->addSeries(series);
            chart->setTitle("Histogram Of Input Signal");
            chart->createDefaultAxes();
            chart->setAxisY(axisY, series);
            chartView = new QChartView(chart);
            chartView->setRenderHint(QPainter::Antialiasing);
            window.setCentralWidget(chartView);
            window.resize(420, 300);
            chart->setVisible(true);
            clock_t chartend = clock();
            qDebug()<< "Execution time is :" << (float(chartend - chartStart) /CLOCKS_PER_SEC);
        return a.exec();
    }
    

    I should mention that I measure my code with some powerful profiler and the command “chart->addSeries(series);” take 510 millisecond to execute my forloop take 3039 ms for 100 BinNumber. QChart does any method for fast drawing? How can I edit this code for increasing drawing speed?



  • @hadi_m
    I think maybe the new statement in the for loop dominate the speed.

    you have already knows how many bars you need, why not use a QList or QVector to allocate the memory first, and then go though it and set the proper information to the elements?



  • Thanks for your replying
    I tested with local QBarSet Qlist instead of dynamically created it but it doesn’t matter on speed.
    I should mention I test my program by some powerful performance validator tools and I notice the line “chart->addSeries(series);” take too long time and of course my forloop take time when BarNumber Increases to 1000.



  • @hadi_m bar set is slow。unfortunately,no way resolve it



  • @hadi_m
    Try by taking different thread for those two loops and addSeries can do it in main thread only.


  • Moderators

    @Venkatesh-V If chart->addSeries(series); is the problem, then I don't think using multi threading will give any advantage (instead it will complicate stuff).


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.