在Scala中String到Int到String的转换有多贵?

时间:2015-10-01 17:29:36

标签: scala type-conversion

我正在尝试检查特定字符串是Int(或Boolean还是Long依此类推等等),但确实不需要< / strong>将其解析为Int(或其他)。我可以想到两个选择。首先,要执行var.toInt.toString或仅返回toInt被调用的实际字符串(如果它是Int)。虽然两者都很好,但我想知道前者与后者相比是否更加广泛。仅供参考,我不会以这种方式解析非常长的字符串,但我会查看数TB的数据。

1 个答案:

答案 0 :(得分:8)

首先,回答确切的问题:

.toString在我的机器上需要几十秒,其中细节当然取决于机器以及int的字符串表示的长度(最短和最长之间的差异为~2倍)。 .toInt占用的时间较少(大约是toString的1/2到3/4)。

这有关系吗?好吧,超过数TB的数据(主要是数字,我猜测),你将拥有数万纳秒或数万秒的数万亿。也许它确实如此;它需要额外的计算时间。

但那不会发生什么。如果您对整数的内容使用toInt,那么您将抛出异常。例外情况非常缓慢 - 通常至少需要几微秒。如果超过大约1/1000个假设的整数实际上没有整数,那么您将花费大量时间为解析异常创建大堆栈跟踪然后将它们丢弃。

您可以尝试使用正则表达式。这通常比仅进行解析便宜约10倍,但比抛出异常便宜10倍。除非你有几个额外的计算日来解决问题,否则仍然不是一个好的选择,特别是因为正则表达式只会告诉你它是否像 在范围内,所以你必须解析它(并捕获异常或进行繁琐的边界检查)。

因此,如果你真的希望它快速,你最终必须手动进行验证,通过字符串索引,使用charAt抓取字符,等等。是的,这很痛苦。但是,如果你自己解析它,它将与单个.toInt一样快。这是一个很难看的代码块。如果人们可能在其他字符集中有数字值,那么使用java.lang.Character.digit通常是一种方法(你可以捕获-1返回和保释)。不要忘记处理积极和消极的不同(由于范围不同)。

附录:您可能认为java.util.Scanner只是门票。它逐步执行数据并使用hasNextInt方法。不幸的是,它的速度非常慢。

另请参阅What's the best way to check to see if a String represents an integer in Java?以获取问题的Java答案(其中没有一个是IMO的想法)。