如何最高效率時為正整數擴大一千倍的一個正整數?
當這個問題被拋給人腦的時候,接受過優秀的九年義務教育的我們稍加思索就能給出一個調皮而又不失大師風範的答案:添三個零就行了~
但是當這個問題交給程式設計師用程式碼解決的時候,問題就要從程式設計的角度去考慮。我作為phper
第一時間想到的方案分別是
方案1:在數字末尾黏連字串「000」
方案2:將原數字簡單的乘以1000
當我把這個問題丟給我的朋友的時候,他告訴我:
方案1肯定不行!你應該採用方案2,但是如果你夠雞賊的話,你應該採用正整數X 1024 - 正整數X 24
!
因為計算機是二進制,當你告訴他要乘以1000的時候,他會進行正整數X 512 正整數X 256 正整數X 128 正整數X 128 正整數X 64 正整數X 32 正整數X 8
#的1000 倍為止。而運算2的10次方
要比那一串加號更快接近結果。
【推薦學習:PHP影片教學】
大佬的這段話很快打動了我。為了實踐大佬的真知,證明大佬的闡述對我猶如醍醐灌頂般點醒夢中人,我迅速寫出了一小段方法,將一個隨機正整數擴大1000倍的算法用三種不同的方法分別跑一千萬次,查看各個方法運行的效率(使用框架:laravel)
// 图表内容 $headers = ['次数', '方案1:拼接法', '方案2:乘1000', '方案3:乘以 1024']; $data = [ [0=>'第一次'], [0=>'第二次'], [0=>'第三次'] ]; // 每个方法执行三次 for ($count = 0; $count < 3; $count ++) { // 生成变量名 : plan1start1 $start = Carbon::now()->getPreciseTimestamp(); for ($i = 0; $i < 10000000; $i ++) { $integer = rand(1, 999); $result = (int)($integer . '000'); } $end = Carbon::now()->getPreciseTimestamp(); $data[$count][] = ($end - $start)/1000000 . '秒'; } for ($count = 0; $count < 3; $count ++) { $start = Carbon::now()->getPreciseTimestamp(); for ($i = 0; $i < 10000000; $i ++) { $integer = rand(1, 999); $result = $integer * 1000; } $end = Carbon::now()->getPreciseTimestamp(); $data[$count][] = ($end - $start)/1000000 . '秒'; } for ($count = 0; $count < 3; $count ++) { $start = Carbon::now()->getPreciseTimestamp(); for ($i = 0; $i < 10000000; $i ++) { $integer = rand(1, 999); $result = $integer * 1024 - $integer * 24; } $end = Carbon::now()->getPreciseTimestamp(); $data[$count][] = ($end - $start)/1000000 . '秒'; } $this->table($headers, $data);
將這段程式碼運行多次後均得到一個較為穩定的結果:
看到這個結果,大大的疑問重新佔領了我小小的腦瓜。 乘以 1024 再減 乘以 24
反而比直接乘以 1000
慢一些。當我拿著這個結果去尋找大佬解決疑惑時,得到了他這樣的回答:
平常工作不夠多是不是?還有空做這種試驗?
暗戳戳鄙夷他一把,順便把他在我心中的地位從大佬
降格為我的某個不願透露姓名的普通朋友
。我繼續了對這件事請的思考。
在正整數後面拼接字串 ‘000’,要把這個正整數轉換成字串,然後拼接字串 ‘000’,之後再轉回正整數。計算的複雜程度遠超正整數的直接計算,時間上明顯劣於後者,這點經過驗證也毋庸置疑。
但是我的某個不願透露姓名的豆豆同學對二進制
計算模式解釋的同樣頭頭是道。我學習的是解釋型語言 php
,這意味著有一群對程式碼理解達到骨灰級的玩家在我看不到的地方對php
進行了大量的演算法優化。而豆豆同學學習的是編譯型語言 C
。是不是這種解釋型語言的不同點,導致了本次運算結果的不同? 為
以上是PHP最高效率的將一個正整數擴大一千倍的詳細內容。更多資訊請關注PHP中文網其他相關文章!