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

aa8*_*a8y 2 scala type-conversion

我试图检查一个特定的字符串是否是一个Int(或BooleanLong等等等等),但并不真的需要它被它解析为一个Int(或其他).我可以想到两个选择.首先,要做一个var.toInt.toString或只是返回toInt调用的实际字符串,如果它是一个Int.虽然两者都很好,但我想知道前者与后者相比是否更加广泛.仅供参考,我不会以这种方式解析非常长的字符串,但我会查看数TB的数据.

Rex*_*err 8

首先,回答确切的问题:

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

这有关系吗?好吧,超过太字节的数据(大多数数字,我猜)你将拥有数万纳秒或数万秒的数万亿.也许它确实如此; 这将是额外的计算时间.

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

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

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

附录:你可能认为java.util.Scanner只是门票.它遍历数据并有一个hasNextInt方法.不幸的是,它的速度非常慢.

另请参阅检查String是否表示Java中的整数的最佳方法是什么?对于Java问题的答案(没有一个是IMO的想法).