J2ME 優化不是微調,是生存法則。以下 30 條鐵律涵蓋算法、數據結構、字節碼、繪圖、內存、網絡各層面,每條都是實戰驗證的生死線。建議打印貼在顯示器邊,重構時逐條自查。
setClip() 限制重繪區域。w = img.getWidth() 別寫在循環裡。+ 拼接產生大量臨時對象 → 用 StringBuffer 復用。static final 就 static final:內聯、免同步、免多態查找。x * 8 → x << 3,x / 16 → x >> 4。i % 16 → i & 0xF(需 2 的冪)。if (x != 0) 比 if (x == 5) 快(JVM 指令 ifne vs if_icmpeq)。arr[i] 存入局部變量 int v = arr[i] 再用。a = x * y + z; b = x * y - z; → t = x * y; a = t + z; b = t - z;。int local = field,結束再寫回。callSerially() 別 wait/notify:前者由事件線程調度,無上下文切換開銷。switch 用小連續 int:編譯器生成 tableswitch 跳轉表,O(1) 分發。float f = (float)Math.sin((double)x) 產生雙向轉換,改用定點。x / c → x * (1.0f/c),預計算倒數。com.nokia.mid.ui、com.siemens.mp 等,做平台判斷分支,保護可移植性。reset() 復用,禁 new。close()/dispose()。RecordEnumeration 遍歷比單條 getRecord() 快數倍。| 優化 | 代碼前 | 代碼後 | 收益 |
|---|---|---|---|
| 字符串緩衝 | s = a + b + c; | sb.append(a).append(b).append(c); | 消除臨時對象,減 GC |
| 循環不變量外提 | for(i) x = img.getWidth(); | w = img.getWidth(); for(i) x = w; | 省方法調用/字段讀取 |
| 位移替代乘除 | x = y * 16; | x = y << 4; | 指令週期 1/10 |
| setClip 限制重繪 | g.fillRect(0,0,W,H); | g.setClip(dirtyX,dirtyY,dirtyW,dirtyH); g.fillRect(...); | 像素處理量降 90%+ |
| 對象池 | new Bullet() 每幀 | pool.acquire().reset(); | 零分配,GC 歸零 |