최대 5*10^6
2D 포인트 를 포함 할 수있는 텍스트 파일이 있습니다 .
이 파일을 읽는 코드를 측정하고 실험 한 후 병목 현상 QString::split
이 다음과 같은 기능을 사용하여 읽기 줄을 부분으로 나누는 곳이라는 것을 알았습니다 .
QString x, y; QStringList lineParts;
while (!inputSream.atEnd())
{
line = inputSream.readLine();
if (line.size() > 0)
{
if (! line.contains("#"))
{
>> lineParts = line.split(' ', QString::SkipEmptyParts); // performance go down by a almost ~2 seconds
x = lineParts.at(0);
y = lineParts.at(1);
QPointF p;
qreal yd = y.toDouble();
p.setX(x.toDouble());
p.setY(yd);
if (yd < yRanges.first)
yRanges.first = yd; // minY
if (yd > yRanges.second)
yRanges.second = yd; // maxY
points.push_back(p);
} else
{
headers.push_back(line);
}
}
}
이 기능이 없으면 파일을 거의 2 배 빠르게 읽습니다.
QString
분할이 왜 그렇게 느리게 작동합니까?
자신의 분할 함수를 작성하지 않고이 작업의 성능을 향상시키기 위해 무엇을 할 수 있습니까?
추신
나는 전체 파일 읽기를 2 개의 스레드로 분리하려고 생각하고 있었는데, 그중 하나는 라인을 버퍼로 읽고 포인트로 다른 작업을 수행하는 해당 슬롯에 대한 파일 읽기 완료 신호를 방출합니다.
그러나 이것은 나에게 약간의 오버 헤드와 성능 이득이없는 것처럼 들리는데, 그것이 여전히 동기 연산을하는 것만 큼 다르지 않을 것이기 때문입니다 : "라인이 읽히지 않는 동안 그것을 파싱 할 수 없습니다"따라서 나는 더 나은 것이라고 생각합니다 문자열을 더 빨리 분할하려면
Qt5.4 이상을 사용하는 경우
" QString::splitRef
"를 사용하십시오 . 이것은 더 빠를 것입니다.
split
반환의 목록에서 하위 문자열의 복사본 Qstring
.This 메모리 할당의 추가 부담이있다.
의 splitRef
벡터에 대한 반환, 하위 문자열 참조 (데이터 사본 만 해당) QStringRef
. 이렇게하면 참조 만 반환되므로 메모리 할당 부담을 피할 수 있습니다.
문서에 " 이 클래스 (QStringRef)는 기존 QString 인스턴스에서 얻은 하위 문자열을 조작 할 때 하위 문자열 처리 성능을 향상 시키도록 설계되었습니다. QStringRef는 단순히 원래 문자열의 일부를 참조하여 표준 QString의 메모리 할당 및 참조 계산 오버 헤드를 방지합니다. . "
http://doc.qt.io/qt-5/qstringref.html#details
참고 : 원래 문자열의 수명이나 범위에주의해야합니다. " 이 문자열이 살아있는 한 모든 참조는 유효합니다.이 문자열을 삭제하면 모든 참조가 매달려있는 포인터가 됩니다." http://doc.qt.io/qt-5/qstring.html#splitRef
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다