2014-09-22 43 views
0

我想改善這個代碼:的Java想提高代碼剪斷

for (int i = 0; i < a.length(); i++) { 
    for (int j = 0; j < b.length(); j++) { 
     if (arrayA[i] == arrayB[j]) { 
      arrayA[i] = ' '; 
      arrayB[j] = ' '; 
     } 
    } 
} 

的代價高昂的操作是

arrayA[i] = ' '; 
arrayB[j] = ' '; 

如果我評論說出來的代碼運行從180ms時至12ms的...

需要類似的東西,所以我可以計數空數組。

+4

如果你註釋掉這兩行,編譯器可能會注意到你的循環沒有做任何事情,並且完全將它們優化掉。我懷疑時間結果反映了這兩條線的成本。 'arrayA'和'arrayB'最初包含什麼? – 2014-09-22 23:29:17

+1

註釋掉一行,其性能如何?這將允許您從理論上確定只需一套操作的成本。兩組操作的差值乘以2. – Compass 2014-09-22 23:30:11

+2

@Compass - 除非註釋掉一行影響'if'語句正文的頻率。 – 2014-09-22 23:31:06

回答

2

只要符合if條件,就可以通過跳出內部迴路來改善此情況。您也可以使用外循環的臨時變量內,以避免不斷地做的arrayA下標內環內提高性能:

for (int i = 0; i < a.length(); i++) { 
    char ch = arrayA[i]; 
    for (int j = 0; j < b.length(); j++) { 
     if (ch == arrayB[j]) { 
      ch = ' ' = arrayB[j] = ' '; 
      break; 
     } 
    } 
    arrayA[i] = ch; 
} 

的原因,它是安全的跳出內部循環的是,一旦ch(或原始代碼中的arrayA[i])設置爲' ',然後在內部循環的後續過程中,只有在arrayB[j]已經是' '時,if測試纔會成功,因此分配會使值保持不變(並且僅消耗cpu週期)。

+0

你仍然會得到與以前相同的輸出,或者只是改變同一元素的第一次出現,然後跳出內部循環。 – Juniar 2014-09-23 03:59:46

+0

@Juniar - **如果**最初的'arrayB'值不包含任何''''字符,那麼這將得到相同的輸出。 (至少我是這麼認爲的 - 這還沒有經過測試。)如果他們這樣做,那麼'break;'語句需要被刪除以獲得相同的輸出。即使沒有'break',在外部循環中使用局部變量仍然可以加快速度。 – 2014-09-23 04:02:35

+0

@Juniar - 經過進一步的思考,只要'if'測試成功,就應該立即跳出內部循環。我解釋了爲什麼在編輯我的答案。 – 2014-09-23 04:08:59