0

我有一种情况,我需要从一个可能很大的 s 中解析很多小std::strings std::string(我正在使用 20M 进行压力测试std::string)。我跟踪std::string要解析的开头的索引,当我到达结尾时,std::string我会做一个substr大的std::string. 然后,我将这些std::string已解析出来的 s 用作 a 的键std::map

我希望通过切换到char*. 我收集到我需要做的是维护指向要解析出的字符串开头的指针,在解析字符串时计算字符串的长度,然后实例化一个char*保存解析出的字符串长度的新字符串。然后我strncpy/memcpy把字符串改成新的char*。当我使用这个 newchar*作为 a 的键时,std::map我必须提供一个比较函子来运行 a strcmp

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

4

1 回答 1

3

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

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

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

于 2013-01-09T01:52:32.303 回答