簡體   English   中英

在Scala中String到Int到String的轉換有多貴?

[英]How expensive is String to Int to String conversion in Scala?

我試圖檢查一個特定的字符串是否是一個Int (或BooleanLong等等),但實際上並不需要將它解析為Int (或其他)。 我可以想到兩個選擇。 首先,做一個var.toInt.toString或只返回其上實際字符串toInt如果它是一個被調用Int 雖然兩者都很好,但我想知道前者與后者相比是否更加廣泛。 僅供參考,我不會以這種方式解析非常長的字符串,但我會查看數TB的數據。

首先,回答確切的問題:

.toString在我的機器上花了幾十納秒,細節當然取決於機器,也取決於int的字符串表示的長度(最短和最長之間約差為2倍)。 .toInt需要更少(大約是toString 1/2到3/4)。

這有關系嗎? 好吧,超過太字節的數據(大多數數字,我猜)你將擁有數萬納秒或數萬秒的數萬億。 也許它確實如此; 這將是額外的計算時間。

但那不會發生什么。 如果您使用toInt的東西,是不是整數,你會拋出異常。 例外情況非常緩慢 - 通常至少需要幾微秒。 如果超過大約1/1000的假設實際上沒有實際注入,那么您將花費大量時間為解析異常創建大堆棧跟蹤然后將它們丟棄。

你可以嘗試使用正則表達式。 這通常比僅進行解析大約貴10倍,但比拋出異常便宜10倍。 除非你有幾個額外的計算日來解決問題,否則仍然不是一個好的選擇,特別是因為正則表達式只會告訴你它是否類似於 int,而不是它是否在范圍內,所以你必須解析它(並捕獲異常或做精彩的邊界檢查)。

因此,如果你真的希望它快速,你最終必須手動進行驗證,通過字符串索引,使用charAt抓取字符,等等。 是的,這很痛苦。 但是,如果你自己解析它,它將與單個.toInt一樣快。 這是一個很難看的代碼塊。 如果人們可能在其他字符集中有數字值,那么使用java.lang.Character.digit通常是一種方法(你可以捕獲-1返回和保釋)。 不要忘記略微區別地處理正面和負面(由於范圍不同)。

附錄:您可能認為java.util.Scanner只是票證。 它遍歷數據並具有hasNextInt方法。 不幸的是,它的速度非常慢。

另請參閱檢查String是否表示Java中的整數的最佳方法是什么? 對於Java問題的答案(沒有一個是IMO的想法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM