我正在运行非常困难来分析我的应用程序,它向我显示我的功能花费的25%和23%的时间分别是新的和删除。我不明白这是怎么回事。那么有人可以告诉我在我的代码中发生了什么。
inline FixParser(fixmessage& tokenMap, const std::string& str) {
static seperator sep_delim("\x01");
static seperator sep_equal("=");
static std::string error("ERROR: ");
static FixKey fix_Key;
static tokenizer token_equal(error);
static tokenizer token_delim(error);
static tokenizer::iterator itr;
token_delim.assign(str, sep_delim);
int key;
try {
for(tokenizer::iterator it = token_delim.begin();
it != token_delim.end(); ++it) {
token_equal.assign(*it, sep_equal);
itr = token_equal.begin();
key = boost::lexical_cast<int>(*itr);
if(fix_Key.keys.find(key) == fix_Key.keys.end()) continue;
++itr;
const std::string& value(*itr);
tokenMap.insert(std::pair<int, std::string>(key, value));
}
} catch(boost::bad_lexical_cast &) {
std::cerr << error << str << std::endl;
return;
}
}
我请求原谅static
使用它们将在以后删除并放入struct
。
答案 0 :(得分:3)
一个注意事项:正在复制 lot 字符串。每个字符串都会调用new
来获取内存,delete
来释放内存。
如果性能非常高并且您能够保留str
的副本,则可能需要使用索引。也就是说,令牌是成对的索引(开始,结束)而不是完整的字符串。这显然更容易出错。
此外,tokenMap
在地图中为每个条目分配一个节点,如果您有大量条目,则会有很多节点(因此new
创建它们)。您可能希望使用deque
,并在完成后对项目进行排序,除非您确实需要map
提供的内容(自动重复数据删除)。
Bikesheded版本,删除大多数静态变量(无法帮助自己):
inline FixParser(fixmessage& tokenMap, const std::string& str) {
static seperator sep_delim("\x01");
static seperator sep_equal("=");
static FixKey const fix_Key;
try {
tokenizer token_delim(str, sep_delim);
// avoid computing token_delim.end() at each iteration
for(tokenizer::iterator it = token_delim.begin(), end = token_delim.end();
it != end; ++it)
{
tokenizer token_equal(*it, sep_equal);
tokenizer::iterator itr = token_equal.begin();
int const key = boost::lexical_cast<int>(*itr);
if(fix_Key.keys.find(key) == fix_Key.keys.end()) continue;
++itr;
tokenMap.insert(std::make_pair(key, *itr));
}
} catch(boost::bad_lexical_cast &) {
std::cerr << error << str << std::endl;
return;
}
}
答案 1 :(得分:2)
确保您正在测试Release版本,而不是Debug版本。调试版本使用不同版本的new
和delete
来帮助以牺牲速度为代价来检测内存泄漏,而Debug版本不会进行太多优化(如果有的话)。
答案 2 :(得分:0)
我会看boost::lexical_cast
。在其最简单的形式中,它只使用流。它可能会做很多分配。
答案 3 :(得分:0)
静力学可能是问题所在。你有多少时间调用函数FixParser
?
每当你调用它时,token_delim
和token_equal
对象就会分配调用的方法,如果它们像向量赋值一样实现,那么支持序列的内存将被销毁,然后每次分配调用FixParser
函数来分配新条目。