【问题标题】:converting string to number in order to to compare them faster将字符串转换为数字以便更快地比较它们
【发布时间】:2016-01-08 10:21:43
【问题描述】:

我有一组字符串(可能超过 10000 项)。这组数据将成为某些优化算法的输入,这意味着将对其进行许多比较操作。唯一的比较操作是相等或不相等。

问题: 从性能的角度来看:将这些字符串转换为数字(通过一种方法或另一种方法)然后对这些数字运行算法是否是个好主意?

附:直到所有字符串都变成数字所需的时间不是问题,因为我会这样做并将其再次存储在数据库中,所以这是一次性的。

【问题讨论】:

  • 是的,这是个好主意,您可以简单地将它们替换为存储它们的数组中的索引并删除重复项。
  • “多次比较输入数据”是什么意思?测试某个字符串是否在字符串集中?使用预先计算的哈希值。但是简单地多次比较常量字符串是没有意义的。
  • 如果有很多个比较,则从文本转换为内部格式。使用内部格式进行多次比较。

标签: c++ string performance c++11


【解决方案1】:

这取决于您的数据的使用情况。在你给我们更多细节之前,我无法说出答案。但我想问你一些问题:

1) 你会对这些项目进行分类吗? std::set 是你的朋友,因为插入时间是 O(log N)

2) 你将如何存储结果?以字符串格式或整数格式(即数据库字段为字符串或整数)

这可能是一个问题,但我认为转换不是一个大而沉重的开销

3) 变量有多大,是char(0-255)、int、long、double?

如果是char、int、long,我建议你这样做。 但不是 double,double == double 是个坏主意。

4) 所有数据都是某种类型?有什么例外吗?


我个人建议进行转换。除非有特殊情况。

【讨论】:

    【解决方案2】:

    使用 memcmp。它使用起来最快且简单。
    直接内存比较是最快的方法。
    使用正确的策略来执行最佳方法。尝试读取固定缓冲区大小的数字并比较两者。数字必须正确放置在缓冲区中,从右到左。

    【讨论】:

    • 即使比较 10 个租船人字符串也会比整数比较快?
    • 转换为数字的时间增加了成本。
    • 假设转换时间为零?
    • 如果数字大小不同,memcmp 将不起作用。例如,比较一个 4 位数字和一个 3 位数字,memcmp 将比较第一个数字,这是错误的(应该隐含 0 作为 3 位数字的第一个数字)。
    • 即使所有字符串都是固定长度的(并且背靠背存储,而不是指针数组),这也只能像处理整数数组一样高效如果字符串的长度为 1、2 或 4(或 8,使用 64 位代码)。在 x86 上(所有架构都类似),cmp eax, [rsi] 进行 4 字节比较,但 5 字节比较需要多条指令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多