【问题标题】:QStringList creation in place for parameter passing为参数传递创建 QStringList
【发布时间】:2022-07-22 09:43:58
【问题描述】:

我有一个以QStringList 作为参数的函数。 QStringList 是为参数传递而创建的。我想到了两种可能性:

myFunction(QStringList() << myQString); // possibility 1
myFunction(QStringList { myQString }); // possibility 2

哪种可能性更高?

【问题讨论】:

  • 唯一确定的方法是编写基准和度量。我预计差异(如果有的话)会非常小。
  • 在没有测量的情况下谈论性能通常不是一个好主意。但是,在这种情况下,第一个变体很可能相同或更慢,因为您正在构建一个空列表然后附加一个元素。第二个选项使用已经存在的元素构造列表。
  • 这可能并不重要,除非代码被执行数十万次,这样每次调用的小额节省就会产生影响。在我的代码中,我同时使用了这两种形式,但现在为所有新用法编写第二种形式。
  • 感谢您对细节的关心。恕我直言,这是用 C++ 编写代码时的一个好习惯,因为语言/编译器非常无情。顺便提一句。关于容器,更常见的错误是将它们不必要地按值传递给函数,而不是通过 const 引用,但这与函数本身的声明/定义方式有关。

标签: c++ qt qstringlist


【解决方案1】:

这是基准:

#define ct_Benchmark(EXPR, repeat){\
    int repeated = repeat;\
    qint64 initialTime = QDateTime::currentMSecsSinceEpoch();\
    qint64 totalTime   = initialTime;\
    EXPR;\
    initialTime = QDateTime::currentMSecsSinceEpoch() - initialTime;\
    for ( int ___i_ = 0; ___i_ < repeated; ___i_++) {\
        EXPR;\
    }\
    totalTime = QDateTime::currentMSecsSinceEpoch() - totalTime;\
    qreal averageTime = qreal( totalTime / repeated );\
    const QString expression(#EXPR);\
    const QString iterations(" Cycles: " + QString::number( repeated    ) );\
    const QString initial   ("Initial: " + QString::number( initialTime ) );\
    const QString total     ("  Total: " + QString::number( totalTime   ) );\
    const QString average   ("Average: " + QString::number( averageTime, 'g', 24 ) );\
    ct_Info(expression, iterations, initial, total, average);\
}
    QString sneed("'s feed & seed. Formerly chucks.");
    ct_Benchmark( QStringList{ sneed }, 1000000 );
    ct_Benchmark( QStringList( QStringList() << sneed ), 1000000 );

调试

Info /home/anon/Programming/QtConsoleDesigner/QtSandbox/src/sandbox.cpp:57
int main(int, char**)

QString expression
"QStringList( QStringList() << sneed )"

QString iterations
" Cycles: 10000000"

QString initial
"Initial: 0"

QString total
"  Total: 3461"

QString average
"Average: 0"
Info /home/anon/Programming/QtConsoleDesigner/QtSandbox/src/sandbox.cpp:56
int main(int, char**)

QString expression
"QStringList{ sneed }"

QString iterations
" Cycles: 10000000"

QString initial
"Initial: 0"

QString total
"  Total: 2094"

QString average
"Average: 0"

发布:

Info /home/anon/Programming/QtConsoleDesigner/QtSandbox/src/sandbox.cpp:57
int main(int, char**)

QString expression
"QStringList( QStringList() << sneed )"

QString iterations
" Cycles: 10000000"

QString initial
"Initial: 0"

QString total
"  Total: 545"

QString average
"Average: 0"
Info /home/anon/Programming/QtConsoleDesigner/QtSandbox/src/sandbox.cpp:56
int main(int, char**)

QString expression
"QStringList{ sneed }"

QString iterations
" Cycles: 10000000"

QString initial
"Initial: 0"

QString total
"  Total: 379"

QString average
"Average: 0"

使用 GCC 编译。 可能性 1 QStringList{ sneed } 大约快三分之一。

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 2011-04-22
    • 2022-06-11
    • 2017-09-04
    • 2020-02-05
    • 2021-06-07
    • 1970-01-01
    • 2021-12-23
    • 2019-11-28
    相关资源
    最近更新 更多