我必须处理 450 个唯一字符串大约 5 亿次。每个字符串都有唯一的整数标识符。有两个选项供我使用。
- 我可以将标识符附加到字符串中,并在到达时 string 我可以拆分字符串来获取标识符并使用它。
- 我可以将 450 个字符串存储在
HashMap<String, Integer>
中等等 字符串到达,我可以查询HashMap
获取标识符。
有人可以建议哪种选项在处理方面更有效吗?
最佳答案
这一切都取决于字符串的大小等。
你可以做各种各样的事情。
您可以使用二分搜索来获取列表中的索引,该索引处就是标识符。
您可以仅对前 2 个字符进行散列,而不是对整个字符串进行散列,这可能比二分搜索更快,假设字符串具有良好的分布。
如果第一个字符或前两个字符在指向标识符的 255 或 65K 大型数组中作为“完美索引”是唯一的,则可以使用它们。
此外,如果您的标识符是数字,最好预先计算它,而不是一直动态转换它。文本 -> 二进制实际上相当昂贵(二进制 -> 文本更糟糕)。因此,如果可能的话,最好避免这种情况。
但你应该解决这个问题。 100 万个任何东西,每个 1 毫秒,就是 20 分钟的处理时间。在 500m 处,每浪费一纳秒,就会增加 8 分钟以上的处理时间。您可能不在乎,但只是证明在这些规模上“每一点都有帮助”。
所以,不要相信我们的话,测试不同的东西来找到最适合你的工作集的结果,然后就这样做。还要考虑过多的对象创建,并避免这种情况。通常情况下,我不会再考虑这个问题。对象创建速度很快,但纳秒就是纳秒。
如果您使用 Java,并且您并不真正需要 Unicode(即您正在使用 0-255 范围内的单个字符),那么我根本不会使用字符串。我会使用原始字节。字符串基于 Java 字符,即 UTF-16。 Java Readers 将 UTF-8 转换为 UTF-16。单例的。时间。 5亿次。是的!又是几纳秒。 8 纳秒会使您的处理时间增加一个小时。
所以,再一次,看看所有的角落。
或者,不要,简单地编写它,启动它,在周末运行它,然后完成它。
关于java - HashMap的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25696524/