最近開始刷LeetCode上的題目, 第一題 two sum 中, 先使用了一下暴力法, 運行了一下, 發現速度和題目給出的答案有出入, 看了一下, 發現了不同。我的代碼如下:
private static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] == target - nums[j]) {
return new int[]{i, j};
}
}
}
return null;
}
而給出的答案稍有不同,第4行的條件語句代碼爲:
if (nums[j] == target - nums[i])
想了一下,所給答案之所以更快可能是因爲JIT(just-in-time)技術發生了作用。因爲在每一次最外層的遍歷中,target - nums[i] 都是一個定值,在程序的內層遍歷中,程序字節碼經過JIT環境變量進行判斷,屬於“熱點代碼”(多次調用的方法,或循環等), 所以JIT技術會發生作用。
這也告訴我們,以後寫Java程序的時候,要注意JIT技術是否會被應用到,改一下程序的結構,可能會爲程序性能帶來很大提高。比如在這個例子中,僅僅是對調了一下 if 條件句中兩邊語句的順序,程序性能就發生了很大變化。