簡體   English   中英

integer 和字符串比較在優化上有什么區別嗎?

[英]Is there any difference in optimization between integer and string comparison?

我正在嘗試制作游戲,並且我有一個選擇 class ,其中包含一個名為 str 的字符串。 我每 17 毫秒將以下代碼應用於我的選擇對象。

if(s.Str == "Upgrade") {
            
}else if(s.Str == "Siege") {
        
}else if(s.Str == "Recruit") {
            
}

換句話說,這些選擇對象會根據它們的類型(升級、攻城等)做不同的工作。 我在其他地方使用 str 變量。 我的問題是:
如果我在第一次創建對象時將類型分配給 integer 會更優化嗎?

if(s.type == 1) {
                
}else if(s.type == 2) {
            
}else if(s.type == 3) {
            
}

這將使我編寫額外的代碼行(因為我必須在第一次創建時按類型分隔對象)並使代碼更難以理解,但是比較整數而不是比較字符串之間會有區別嗎?

如果您以 >that< 方式比較字符串,則可能沒有性能差異。

但是,這是比較字符串的錯誤方法。 正確的方法是使用equals(Object)方法。 例如。

  if (s.Str.equals("Upgrade")) {

讀這個:


我每 17 毫秒將以下代碼應用於我的選擇對象。

測試兩個字符串是否相等所需的時間可能在幾十納秒的數量級。 所以......基本上......比較字符串或整數之間的區別是無關緊要的。

這說明了為什么過早優化是一件壞事。 只有當你知道花時間在它上面是值得的時,你才應該優化代碼; 即當你知道會有回報時。


那么我應該在編寫並完成所有代碼后進行優化嗎? “不進行過早優化”是否意味着?

不,這並不完全是這個意思。 (嗯.. 反正對我來說不是。)這對我來說意味着你不應該優化,直到:

  1. 你有一個工作程序,你可以衡量它的性能,
  2. 您已經確定了具體的(可量化的)績效標准,
  3. 您有衡量績效的方法; 例如,涉及真實或現實用例的適當基准,以及
  4. 你有很好的方法來識別實際的性能熱點。

如果您在具備上述條件之前嘗試優化,您很可能會因為錯誤的原因優化代碼的錯誤部分,並且您的努力(程序員時間)很可能會被無效率地花費。

在您的具體情況下,我的直覺是,如果您遵循推薦的流程,您會發現1這個String vs int (vs enum ) 與您游戲的可觀察性能2無關。

但是如果你想比“直覺”更科學,你應該等到1到4都解決了,然后測量,看看實際表現是否符合你的標准。 只有這樣你才能決定是否優化。


1 - 我的預測假設您對問題的描述與現實足夠接近。 當人們試圖“通過肉眼”而不是通過測量來識別性能問題時,這始終是一種風險。
2 - 與其他事物有關; 例如代碼可讀性和可維護性,但我不會在這個答案中解決這些問題。

Stephen C 的回答是正確和明智的。 但是您的示例代碼完全可以采用不同的解決方案。

枚舉

如果您想要性能、類型安全、更易於閱讀的代碼,並且想要確保有效值,請使用枚舉對象,而不僅僅是字符串或整數。

public enum Action { UPGRADE , SIEGE , RECRUIT }

您可以對各種可能的枚舉對象使用開關。

  Action action = Action.SIEGE ;
  …

  switch ( action ) 
  {
     case UPGRADE:
        doUpgradeStuff() ;
        break;
     case SIEGE:
        doSiegeStuff() ;
        break;
     case RECRUIT:
        doRecruitStuff() ;
        break;
     default:
        doDefaultStuff() ;
        break;
  }

以這種方式使用枚舉在未來會變得更好。 請參閱JEP 406:開關的模式匹配(預覽版)

請參閱 Oracle 關於枚舉的Java 教程 例如,請參閱他們的 教程,使用 enums for month、day-of-week 和 text style

另請參閱此問題,鏈接到其他人。

與 Java 中的字符串相比,比較像 Integer 這樣的原始數字肯定會更快。 如果您每 17 毫秒執行一次,它將為您提供更快的性能。

是的,有區別。 String 是 object 而 int 是原始類型。 當您執行 object == "string" 時,它與地址匹配。 您需要使用 equals 方法來檢查完全匹配。

暫無
暫無

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

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