gpt4 book ai didi

c++ - 流解析算法速度问题

转载 作者:太空狗 更新时间:2023-10-29 23:08:09 24 4
gpt4 key购买 nike

我编写了一个波前 Obj 解析器类,用于将 obj 模型导入到我的 OpenGL 项目中。我在 Debug模式下测试了这个类,发现它慢得无法忍受。

代码有效,我进行了明显的调整以确保它在合理实用的情况下尽可能高效。

仍然,加载我的测试文件,一个 12mb 的 obj 文件,运行大约 330,000 行文本,需要一分钟多的时间来解析。

心灰意冷,谷歌了一下,果然I wasn't the first person to run into this problem .

这个在 gamedev.net 上发布他的查询的人只是在 Release模式下运行他的算法,在 Visual Studio IDE 和 whammo 之外,性能可接受。这对我也很有效,我的 ~70 秒减少到 ~3 秒。

我对算法做了一些分析,瓶颈在于对 std::getline 的调用,以及以下内容:

sstream >> sToken;

其中 sstream 是一个 std::stringstream,而 sToken 是一个 std::string(预留空间)。

问题

为什么 IDE 在运行我的解析算法时如此慢得令人难以置信(即使在 Release模式下) - 在通过 IDE 运行代码(F5 - 运行项目)时我能做些什么来加快速度?这使调试速度变慢了。 IDE 是否将代码/ Hook 注入(inject)可执行文件以通过 IDE 运行,或者这是否可以归因于缓存未命中或其他原因?

优化

我对文件进行了两次遍历,在第一次遍历时,我只计算标记类型 - 这样我就可以保留空间(而不是迭代地增加存储顶点、法线、纹理坐标、面等的 vector )

sLineBuffer.reserve( 100 );
sToken.reserve(10);

while( sstream.good() )
{
sstream >> sToken;
getline( sstream, sLineBuffer );

if( sToken.compare("f") == 0 )
nFaces ++;

else if( sToken.compare("v") == 0 )
nVertices ++;

else if( sToken.compare("vn") == 0 )
nNormals ++;

else if( sToken.compare("vt") == 0 )
nTextures ++;

else if( sToken.compare("g") == 0 )
nGroups ++;
}

m_Vertices.reserve( nVertices );
m_Normals.reserve( nNormals );
m_TexCoords.reserve( nTextures );
m_Faces.reserve( nFaces );
m_Groups.reserve( nGroups );

第一次通过成本很小(在 Debug模式下约 8 秒,或在 IDE 外的 Release模式下约 0.3 秒)并且效率节省巨大(将解析时间从 Debug模式下的约 180 秒减少到约 60 秒)。

我还将整个文件读入一个字符串流,以便将磁盘访问排除在等式之外:

// Read entire file from disk into memory
fstream stream;
stringstream sstream;
stream.open( m_sFilename.c_str(), std::ios::in );
sstream << stream.rdbuf();
stream.close();

此外,在可能的情况下,在整个算法中,我尝试提前为 std::strings 保留空间,这样它们就不会根据每个字符调整大小:

sLineBuffer.reserve( 100 );
sToken.reserve(10); // etc

最佳答案

这个问题原来是对 Visual Studio IDE 操作方式的误解。

无论您是在调试还是发布构建中,按 F5 都会在 Debug模式下运行。

我了解了 Ctrl+F5 将调试器从等式中移除的原因(但只有当您运行发布版本时,您才会看到速度在执行此操作时有所提高)。

我还了解到,在这种情况下,stdio 可能是更好的解决方案。我将不得不重写我的算法以按照建议使用 fscanf,并在此处报告我的发现,尽管我对这个想法感到畏缩。

关于c++ - 流解析算法速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10457004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com