C ++ String Instantiation vs strncpy / memcpy

时间:2013-01-09 01:46:44

标签: c++ string performance char

我有一种情况,我需要解析一个可能很大的std::string中的很多小std::string(我用20M std::string进行压力测试)。我跟踪了我要解析的std::string开头的索引,当我到达std::string的末尾时,我做了substrstd::string }}。然后我使用我已解析的std::string作为std::map的键。

我希望通过切换到char*来加快运行速度。我需要做的是将指针保持到我要解析的字符串的开头,在解析它时计算字符串的长度,然后实例化一个保持字符长度的新char*解析出的字符串。然后我strncpy/memcpy将字符串放入新的char*。当我使用这个新的char*作为std::map的键时,我必须提供一个运行strcmp的比较函子。

我现在拥有的方式,平均需要290毫秒来解析字符串而不插入std::map(插入总共需要450毫秒)。切换到char*会给我带来显着的(任何50毫秒+)更好的结果吗?

1 个答案:

答案 0 :(得分:3)

首先,如果没有尝试,没有人知道真正的答案,所以你可以自己尝试一下。但其次,我们可以做出有根据的猜测:可能不是;无论如何,所有std::string都在内部进行。

您应该做的是创建一个表示现有字符串范围内的类(即存储一对迭代器),并使用此类作为地图的索引。通过这种方式,您可以避免分配一堆微小的字符串,这几乎可以肯定是您的大部分性能受到影响的地方,至少在加载过程中。然后你只需将源字符串保存在内存中,这样迭代器仍然有效。

如果你主要执行查找,你也可以考虑unordered_map(你可以缓存哈希的结果,因为你现在正在使用不可变的字符串),但是再次知道这是否会更快的唯一方法对于所有性能问题都是相同的方法:测试和数据