C++ 字符串实例化与 strncpy/memcpy

标签 c++ string performance char

<分区>

我有一种情况,我需要从一个可能很大的 std::string 中解析出很多小的 std::string(我很紧张-使用 20M std::string 进行测试)。我跟踪要解析的 std::string 开头的索引,当我到达 std::string 的结尾时,我会这样做大型 std::stringsubstr。然后,我使用这些已解析出的 std::string 作为 std::map 的键。

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

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

最佳答案

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

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

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

关于C++ 字符串实例化与 strncpy/memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14227081/

相关文章:

c++ - 如何让Halide使用滑动窗口优化?

c# - 我如何编码一串 1 和 0 以进行传输?

无法使用 sscanf 分隔字符串?

java - JVM 是 32 位还是 64 位?

php - 使用 preg_replace 截断字符串的最有效方法?

c++ - (Qt) QNetworkAccessManager 减慢其他应用程序

c++ - 与 at() 或索引相比,为什么使用 C++ 迭代器会显着增加代码大小?

ios - 得到字符串 Url,但 url 有 "\/"。如何获取字符串中的每个正确值,如数组类型 swift3

PHP速度优化

c++ - C++ 新手,帮助我入门