qDebug-stdcout-printf性能表现

31次阅读

共计 1526 个字符,预计需要花费 4 分钟才能阅读完成。

Qt 君最近感觉 qDebug 相对于 printf 打印感觉有些慢,但又没有证据,于是闲着就写下 qDebug,std::cout,printf 的性能表现咯。注:测试数据仅供参考。

0x00 测试环境

环境 参数
CPU i5-8250U
内存 8G
操作系统 Windows@64 位
Qt 版本 Qt 5.12.1
编译器 MSVC2017@64 位

0x01 数据呈现

  通过使用 qDebug,std::cout,printf 在 1 秒内打印的字符串数据。

  • 分别各测试 10 次后取平均值,详细数据在文末。
debug 版本(次 / 秒) release 版本(次 / 秒)
qDebug 38317 60923
std::cout 382890 372696
printf 432606 386663
  • 图表化显示

0x02 数据分析

  • 性能表现:printf > std::cout > qDebug
  • qDebug()相对于 std::cout 和 printf 差距过大(6~10 倍);
  • std::cout 与 printf 数据基本一致;
  • std::cout 与 printf的 debug 与 release差距不大,甚至有 debug 比 release 快的现象(可能受实验环境影响)。

0x03 结论

  • qDebug 比 std::cout 和 printf 慢,高频调用 有可能影响 系统时延
  • 性能均衡 推荐选用 std::count
  • 追求性能选用printf

0x04 测试程序

#include <QDebug>
#include <QElapsedTimer>
#include <iostream>

/* 注:单独打开某个宏测试 */
//#define TEST1
//#define TEST2
//#define TEST3

int main(int argc, char *argv[])
{
#ifdef TEST1
    {
        QElapsedTimer t;
        qint64 it = 0;
        t.start();
        while (t.elapsed() < 1000) {qDebug() << "Test1";
            it++;
        }

        qDebug() << "Test1:" << it;}
#endif

#ifdef TEST2
    {
        QElapsedTimer t;
        qint64 it = 0;
        t.start();
        while (t.elapsed() < 1000) {
            std::cout << "Test2" << std::endl;
            it++;
        }

        std::cout << "Test2:" << it;
    }
#endif

#ifdef TEST3
    {
        QElapsedTimer t;
        qint64 it = 0;
        t.start();
        while (t.elapsed() < 1000) {printf("Test3\n");
            it++;
        }

        printf("Test3: %lld\n", it);
    }
#endif
    return 0
}

0x05 测试数据(各 10 次)

  • debug 版本
qDebug: 
38310 38452 39416 38420 38962 38385 39293 38814 34178 38946

std::cout: 
389512 397234 378168 367970 366371 364401 405547 405992 365863 387846

printf: 
468310 423937 480598 385025 490155 489473 373419 397995 445099 372054
  • release 版本
qDebug: 
60779 60710 59450 59685 63298 61044 59788 61167 61822 61495

std::cout: 
352541 358754 377001 380487 397576 362145 333757 413027 416352 335320

printf: 
468310 329729 333142 320171 333825 330411 471041 473771 468310 337921

正文完
 0