我有一個Wavefront .obj文件分析器,它使用getline和stringstream分析數據。起初,當模型很小時,沒有問題,但現在,當我嘗試加載大約207000行的模型時,僅在第一次統計所有元素的時候,它花費了大量的時間(〜4.7s)第二次傳球需要半分鐘。另一方面,攪拌機僅在2秒左右就可以加載整個模型。我使用visual studio 2012,目前處於調試模式。使用getline緩慢的istringstream
我計數元素代碼如下所示:
istringstream input(obj);
string line;
while (getline(input, line)) {
if (line.find("# ") != string::npos) {
// Comments.
}
else if (line.find("f ") != string::npos) {
faces++;
}
else if (line.find("v ") != string::npos) {
vertices += 3;
}
else if (line.find("vn ") != string::npos) {
normals += 3;
}
else if (line.find("vt ") != string::npos) {
uvCoordinates += 2;
}
else if (line.find("o ") != string::npos) {
// Count here, if needed.
}
}
代碼實際加載整個數據需要30秒〜:
istringstream input(obj);
string line;
if (faces.capacity() > UINT_MAX/3) {
LOGE("Model cannot have more faces than: %d", UINT_MAX/3);
return false;
}
while (getline(input, line)) {
vector<string> arr = stringSplit(line, ' ');
string param = arr[0];
int params = arr.size();
if (line.length() == 0) {
continue;
}
if (arr[0] == "v") { // Vertices.
vertices.push_back(stringToFloat(arr[1].c_str()));
vertices.push_back(stringToFloat(arr[2].c_str()));
vertices.push_back(stringToFloat(arr[3].c_str()));
}
else if (arr[0] == "vn") { // Normals.
normals.push_back(stringToFloat(arr[1].c_str()));
normals.push_back(stringToFloat(arr[2].c_str()));
normals.push_back(stringToFloat(arr[3].c_str()));
}
else if (arr[0] == "f") { // Faces.
if (params < 4) {
//LOGI("LINE: %s", line.c_str());
continue;
}
else if (params > 4) {
LOGI("Line: %s", line.c_str());
LOGE("Obj models must only contain triangulated faces.");
return false;
}
Face face;
parseFace(face, line);
faces.push_back(face);
}
else if (arr[0] == "vt") { // UV coordinates.
uvCoordinates.push_back(stringToFloat(arr[1].c_str()));
uvCoordinates.push_back(stringToFloat(arr[2].c_str()));
}
else if (arr[0] == "mtllib") { // Material.
material = arr[1];
}
else if (arr[0] == "o") { // Sub-model.
// Separate models here, if needed.
}
}
obj變量爲包含整個文件內容的字符串。 刪除第一個循環內的所有內容都不會影響時間。 關於如何優化這個的任何想法?
值得注意的是流趨於緩慢,如果你需要的性能,實現自己的解決方案。 – lsalamon