為使努力不至白費(fèi),瓶頸的定位是至關(guān)重要的一環(huán)。Donald Knuth[9]曾改進(jìn)過(guò)一個(gè)程序,那個(gè)程序把50%的時(shí)間都花在約4%的代碼量上。在僅一個(gè)工作小時(shí)里,他修改了幾行代碼,使程序的執(zhí)行速度倍增。此時(shí),若將時(shí)間繼續(xù)投入到剩余代碼的修改上,那么只會(huì)得不償失。Knuth在編程界有一句名言:“過(guò)早的優(yōu)化是一切麻煩的根源”(PRemature optimization is the root of all evil)。最明智的做法是抑制過(guò)早優(yōu)化的沖動(dòng),因?yàn)槟菢幼隹赡苓z漏多種有用的編程技術(shù),造成代碼更難理解和操控,并需更大的精力進(jìn)行維護(hù)。
long start = System.currentTimeMillis(); // 要計(jì)時(shí)的運(yùn)算代碼放在這兒 long time = System.currentTimeMillis() - start;
利用System.out.println(),讓一種不常用到的方法將累積時(shí)間打印到控制臺(tái)窗口。由于一旦出錯(cuò),編譯器會(huì)將其忽略,所以可用一個(gè)“靜態(tài)最終布爾值”(Static final boolean)打開(kāi)或關(guān)閉計(jì)時(shí),使代碼能放心留在最終發(fā)行的程序里,這樣任何時(shí)候都可以拿來(lái)應(yīng)急。盡管還可以選用更復(fù)雜的評(píng)測(cè)手段,但若僅僅為了量度一個(gè)特定任務(wù)的執(zhí)行時(shí)間,這無(wú)疑是最簡(jiǎn)便的方法。 System.currentTimeMillis()返回的時(shí)間以千分之一秒(1毫秒)為單位。然而,有些系統(tǒng)的時(shí)間精度低于1毫秒(如Windows PC),所以需要重復(fù)n次,再將總時(shí)間除以n,獲得準(zhǔn)確的時(shí)間。