2011-07-27 63 views
3

這可能看起來像一個相當基本的問題,對此我提前表示歉意。哪個更快,int爲String或String爲int?

我正在編寫一個使用一組預定義數字的Android應用程序。目前我正在使用int值,但在某些時候,我可能還需要使用floatdouble值。

這些數字用於兩件事情。首先,我需要將它們展示給用戶,爲此我需要String(我正在創建自定義View並在Canvas上繪製String)。其次,我需要將它們用於某種計算器,爲此它們顯然需要爲int(或float/double)。

由於數字是否被用作Stringint一樣的,我只是想將它們儲存一次(這也將減少錯誤,如果我需要改變其中任何一個,我只需要改變他們一個地方)。

我的問題是:我應該將它們存儲爲String還是int?編寫int作爲String,或者從String解析int會更快嗎?我的直覺告訴我解析需要更多時間/資源,所以我應該將它們存儲爲int s。我對嗎?

回答

5

其實,你的直覺可能是錯誤的(我強調可以見下面我的意見上測量)。要將字符串轉換爲整數需要一系列乘/加操作。要將整數轉換爲字符串需要除法/模數。很可能前者比後者快。

但我想指出,你應該措施,而不是猜測!景觀充滿了依賴不正確假設的算法屍體。我想指出的是,除非你的計算器每秒鐘都會做巨大的計算數(如果不是數十億的話,我說的是數百萬),這種差異幾乎肯定是不相關的。

在絕大多數用戶交互式應用程序中,99%的計算機時間都花在等待用戶執行某些操作上。

我的建議是做任何事情都會讓開發人員的生活變得更加輕鬆,並且只要(如果)成爲問題就擔心性能。而且,爲了澄清,我建議將它們存儲在原生表單(不是字符串)對於計算器來說是最簡單的。

+0

非常感謝!我將嘗試將它們存儲爲int,因爲大多數評論似乎表明最適合各種原因。儘管我想我會運行一些基準測試,只是出於好奇。感謝大家! –

0

這是更好的設計實踐,讓用戶從基礎數據中獲得視圖而不是其他方式 - 在某些時候,您可能決定使用自己的繪圖函數或固定圖像渲染計算器,以及把你的數據作爲字符串在這裏會很痛苦。

這就是說,使用現代硬件這些操作都不是特別耗時。

2

我會說這不是真的有關。更重要的是類型安全:因爲您有號碼int(或floatdouble)會強制您使用號碼並且不存儲「任意」數據(String允許在某種程度上)。

0

解析是一件很慢的事情,打印號碼不是。作爲數字的內部表示允許您計算,這可能是您打算用數字表示的內容。將數字存儲爲數字(整數,浮點數,小數)也佔用比它們的字符串表示更少的空間,所以......您可能想要將它們存儲爲整數,浮點數或任何它們。

0

您正在編寫移動設備的應用程序,其中的內存消耗是一個巨大的交易。

存儲int便宜,存儲String是昂貴的。去int

編輯:更多解釋。存儲int比特-2^312^31-1花費32比特。不管數字是多少。將其存儲在String中的基數爲10的每個數字爲16比特。

+2

用戶輸入計算器的數量是多少? 5? 10?內存消耗並不重要。 :) – Kaj

1

最好的是做一個長凳測試。寫兩個循環

  • 一個從數字轉換100000個單位爲String
  • 一個從字符串轉換100000個單位,以數字

,並測量通過在每次循環之後得到System.currentTimeMillis()經過的時間。但個人而言,如果我需要對這些數字進行計算,我會以原始格式(int或float)存儲它們,而我只會將它們轉換爲String來顯示。與執行速度相比,這更像是一個設計和可維護性問題。專注於執行速度有時會適得其反:爲了獲得幾個μSec,沒有人會注意到不值得犧牲設計和穩健性(當然,如果這是一個節省大量CPU時間的問題,可能需要做一些妥協)。 This reading may interest you

+0

謝謝。我已經多次閱讀Android最佳實踐文檔,但並非所有內容都陷入了我的大腦:-) –

1

使用計算器的人不會注意到性能差異,但正如其他人所說的那樣。使用字符串作爲你的內部表示是一個壞主意,因爲在這種情況下你沒有獲得類型安全。

如果您決定使用字符串,以後很可能會遇到維護問題。

3

我做了一個1 000 000大小的int和String數組的測試。我只計時的分析和結果說:

  • 案例1,從int到字符串:1 000 000的平均344ms
  • 案例2中,從字符串到int:1 000 000平均在140ms的

結論,你膽子錯了:)!

我和其他人一樣說,這不會讓你的應用變慢。更好地集中精力,使其更簡單,更安全。

+0

謝謝!我目前正處於另一個節目頭痛的問題中,這個回覆讓我微笑:-D –