STL不可信任,大项目慎用

STL只是个玩具,适用在小项目,高层应用上;大项目,底层,千万慎用,不小心就会给效率埋下无底大坑;

事情源起:近两天改写自己的引擎时,OXEntity类改用了两个新的数据结构map<int, map<int, OXTexture>, map<int, OXMesh>, 相关改动很多,主要是查找与设置,
程序编译运行后,吓了一跳,屏幕FPS由之前的130降到37,且启动时地形创建其慢无比,原来瞬间就可以创建的。
第一感觉,可能是STL的问题。查找所有改动的关于STL的代码。发现了许多弱智的用法。如下:

1     if(m_mmapTex[iMesh][iTex]&& !strcmp(m_mmapTex[iMesh][iTex]->GetResource(), pTex))return false;
2     if(m_mmapTex[iMesh][iTex])xresMgr.GetLoaderThread()->RemoveFromTexQueue(m_mmapTex[iMesh][iTex].GetPtr());
3     m_mmapTex[iMesh][iTex]= xresMgr.GetTex(pTex);
4     if(!m_mmapTex[iMesh][iTex])m_mmapTex[iMesh][iTex]= xresMgr.AddTex(pTex);
5     if(m_mmapTex[iMesh][iTex]->IsEmpty())xresMgr.GetLoaderThread()->Push2TexQueue(m_mmapTex[iMesh][iTex].GetPtr()); 
要知道,每个[]都会导致一次map.find(), 上面的用法多么可怕,底层代码的低效会在高层数十倍百倍的表现放大,这很可怕。修改后如下:
 1 bool CXEntity::SetTexture(int iMesh, int iTex, cchar* pTex)
 2 {
 4     OXTexture& rOTex = m_mmapTex[iMesh][iTex];
 5     if(rOTex && !strcmp(rOTex->GetResource(), pTex))return false;
 6     if(rOTex)xresMgr.GetLoaderThread()->RemoveFromTexQueue(rOTex.GetPtr());
 7     rOTex = xresMgr.GetTex(pTex);
 8     if(!rOTex)rOTex = xresMgr.AddTex(pTex);
 9     if(rOTex->IsEmpty())xresMgr.GetLoaderThread()->Push2TexQueue(rOTex.GetPtr());
10     
11     return true;
12 }
可见STL有很多效率问题,在底层千万慎用,即使在高层,也不可大意,对于其内部原理要了解清楚。

一天后......
经过思索再三,最终决定基本放弃STL,尽可能少的使用。经过将几处大的STL改掉后,效率极大提高,看来它的效率差的不是一点半点.

 

转载于:https://www.cnblogs.com/kingqi119/archive/2013/04/06/3002753.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值