当可以时通过视图替换字符串 - Daniel Lemire 的博客

主要观点:

  • C++程序员常用 std::string 类表示字符串,每个 std::string 实例可能占用 32 字节,虽不多但会累积。
  • Node.js 运行时的构建工具中有预计算 16 位整数字符串表示的函数。
  • 创建 65536 个字符串在多数系统上需 2 兆字节内存,可替代方法是创建单个大字符串并记录其内部偏移量。
  • 用 C++代码实现了创建单个大字符串及记录偏移量的函数,此独特字符串只需 382106 字节。
  • 无需实际存储偏移量,可动态计算,计算偏移量只需 256KB 内存。
  • 经基准测试,创建单个大字符串比创建 std::string 数组快约两倍,查询时单个大字符串也更快。
  • 还有其他解决此问题的方法,如按元素固定字节数存储或计算位数等,各有优劣,取决于应用。

关键信息:

  • std::string 类用于表示字符串及相关操作。
  • Node.js 构建工具中的预计算函数。
  • 创建 65536 个字符串的内存需求及替代方案。
  • 实现单个大字符串及偏移量计算的 C++代码。
  • 不同方法在创建和查询时的性能比较。

重要细节:

  • std::vector<std::string> precompute_string()函数用于预计算 16 位整数字符串。
  • 在 precompute_string_fast()函数中通过自定义整数转字符串例程创建单个大字符串及偏移量数组。
  • 基准测试中创建单个大字符串及计算偏移量的时间分别为 0.26ms 和 0.57ms,查询时分别为 0.08ms 和 0.12ms。
  • 提到其他解决问题的方法如固定字节数存储等及它们的权衡。
  • 强调生成很多非必要对象是性能不佳的做法,应整合数据。
阅读 9
0 条评论