我真的很讨厌使用STL容器,因为它们使我的代码的调试版本运行得非常慢.其他人使用什么代替具有合理性能的调试版本的STL?
我是一名游戏程序员,这对我所参与的许多项目都是一个问题.当你使用STL容器时,很难获得60 fps.
我的大多数工作都使用MSVC.
EASTL是一种可能性,但仍然不完美.Electronic Arts的Paul Pedriana对游戏应用程序中的各种STL实现进行了调查,其摘要见以下内容:http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2007 /n2271.html
正在审查其中一些调整以包含在C++标准中.
请注意,即使EASTL也没有针对非优化案例进行优化.我有一个excel文件w /一段时间了一段时间但我想我已经失去了它,但对于访问它是这样的:
debug release STL 100 10 EASTL 10 3 array[i] 3 1
我所取得的最大成功就是滚动自己的容器.您可以将这些降低到接近数组[x]的性能.
我的经验是,设计良好的STL代码在调试版本中运行缓慢,因为优化器已关闭.STL容器向构造函数发出大量调用,operator =在发布版本中进行内联/删除(如果它们很轻).
此外,Visual C++ 2005及更高版本在发布和调试版本中都为STL启用了检查.对于STL重型软件来说,这是一个巨大的性能.可以通过为所有编译单元定义_SECURE_SCL = 0来禁用它.请注意,在不同的编译单元中具有不同的_SECURE_SCL状态几乎肯定会导致灾难.
您可以创建第三个构建配置,并关闭检查并使用它来调试性能.我建议你保持一个调试配置,但是,因为它有助于捕获错误的数组索引和类似的东西.
如果您正在运行的视觉工作室,您可能需要考虑以下事项:
#define _SECURE_SCL 0 #define _HAS_ITERATOR_DEBUGGING 0
那只是为了迭代器,你正在进行什么类型的STL操作?您可能希望了解优化内存操作; 即,使用resize()一次插入多个元素,而不是使用pop/push一次插入一个元素.
对于大型,性能关键型应用程序,根据您的需求构建自己的容器可能值得投入时间.
我在这里谈论真正的游戏开发.