我真的讨厌使用STL容器,因为它们使我的代码的调试版本运行得非常慢。对于调试构建,其他人使用什么来代替具有合理性能的STL?
我是一名游戏程序员,这在我工作过的许多项目中都是一个问题。当你使用STL容器时,很难获得60帧/秒的速度。
我的大部分工作都使用MSVC。
发布于 2008-09-17 20:38:24
EASTL是一种可能性,但仍然不是完美的。电子艺界的Paul Pedriana就游戏应用程序中的性能对不同的STL实现进行了调查,其摘要可在此处找到:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html
正在审查其中一些调整,以将其包含在C++标准中。
请注意,即使是EASTL也不会针对未优化的情况进行优化。前段时间我有一个excel文件,但我想我把它弄丢了,但对于访问来说,它是这样的:
debug release
STL 100 10
EASTL 10 3
array[i] 3 1我获得的最大的成功是滚动我自己的容器。您可以将这些性能降低到接近arrayx的性能。
发布于 2008-09-17 20:37:17
我的经验是,设计良好的STL代码在调试版本中运行缓慢,因为优化器被关闭了。STL容器会向构造函数和operator=发出大量调用(如果它们是轻量级的),它们会在发布版本中被内联/移除。
此外,Visual STL2005和更高版本在发布和调试版本中都启用了C++检查。对于以STL为主的软件来说,这是一个巨大的性能难题。可以通过为所有编译单元定义_SECURE_SCL=0来禁用它。请注意,在不同的编译单元中拥有不同的_SECURE_SCL状态几乎肯定会导致灾难。
您可以在关闭检查的情况下创建第三个构建配置,并使用该配置进行性能调试。我建议你保持一个带检查的调试配置,因为这对捕获错误的数组索引和诸如此类的东西非常有帮助。
发布于 2008-09-17 20:27:49
如果你运行的是visual studio,你可能需要考虑以下几点:
#define _SECURE_SCL 0
#define _HAS_ITERATOR_DEBUGGING 0这只适用于迭代器,您要执行哪种类型的STL操作?您可能希望考虑优化内存操作;即,使用resize()一次插入多个元素,而不是使用pop/push一次插入一个元素。
https://stackoverflow.com/questions/87096
复制相似问题