【发布时间】:2016-08-23 20:47:18
【问题描述】:
我正在尝试拆分包含 UTF-8 编码的纯文本(使用空格作为分隔符)的大量 QByteArray,并尽可能获得最佳性能。我发现如果先将数组转换为QString,我可以获得更好的结果。我尝试使用正则表达式来使用QString.split 函数,但性能非常糟糕。事实证明,这段代码要快得多:
QMutex mutex;
QSet<QString> split(QByteArray body)
{
QSet<QString> slova;
QString s_body = QTextCodec::codecForMib(106)->toUnicode(body);
QString current;
for(int i = 0; i< body.size(); i++){
if(s_body[i] == '\r' || s_body[i] == '\n' || s_body[i] == '\t' || s_body[i] == ' '){
mutex.lock();
slova.insert(current);
mutex.unlock();
current.clear();
current.reserve(40);
} else {
current.push_back(s_body[i]);
}
}
return slova;
}
“Slova”目前是QSet<QString>,但我可以使用std::set 或任何其他格式。这段代码应该找出数组中有多少个唯一词,并尽可能获得最佳性能。
不幸的是,这段代码的运行速度还不够快。我希望从中挤出绝对最大值。
使用callgrind,我发现最贪吃的内部函数是:
QString::reallocData (18% absolute cost)
QString::append (10% absolute cost)
QString::operator= (8 % absolute cost)
QTextCodec::toUnicode (8% absolute cost)
显然,这与源自push_back 函数的内存分配有关。解决这个问题的最佳方法是什么?不一定必须是 Qt 解决方案 - 纯 C 或 C++ 也可以。
【问题讨论】:
-
源代码中QByteArray在哪里?
-
抱歉,“body”是数组。现在将添加上一行。
-
QByteArray中有哪些数据?有必要先把它放在那种类型中吗?输出应该是什么类型?我的意思是 'slova' '单词'?
-
QByteArray 包含以 UTF-8 编码的纯文本。是的,有必要把它放在那种类型中——我使用的 http 服务器库返回那种类型的 http 请求体。输出类型不一定重要。 “Slova”目前是一个 QSet
,但我可以将 STD 集用于任何其他格式。这段代码应该找出数组中有多少个唯一词,并尽可能获得最佳性能。 -
可能的解决方案包括带有 UTF 字符的“裸”缓冲区和一些有效的标记器,例如增强标记器,您最好不要一直锁定和解锁互斥锁,而是在更新之前锁定一次并在之后解锁。我也可以轻松地组成我能想到的 Qt 解决方案,但这可能不会那么快。也不确定“当前”变量在您的代码中的作用。
标签: c++ performance qt split qbytearray