簡體   English   中英

“固定” for循環-更有效的方法是什么?

[英]'Fixed' for loop - what is more efficient?

我正在創建一個井字游戲,其中一個功能必須迭代9個字段中的每個(井字游戲在3x3網格上播放)。 我想知道哪種方法更有效(在這種情況下哪種方法可能更快,或者首選的腳本編寫方式)-對嵌套循環使用兩個這樣的方法:

for(var i=0; i<3; i++) {
 for(var j=0; j<3; j++) {
  checkField(i, j);
 }
}

或像這樣硬編碼:

checkField(0, 0);
checkField(0, 1);
checkField(0, 2);
checkField(1, 0);
checkField(1, 1);
checkField(1, 2);
checkField(2, 0);
checkField(2, 1);
checkField(2, 2);

由於只有9種組合,因此使用兩個嵌套的for循環可能會過大,但是再說一遍,就更容易理解了。 但是,for循環將遞增變量,並每次也檢查i和j是否小於3。

在此示例中,節省的時間至少可以忽略不計,但是在這種情況下首選的編碼方式是什么?

謝謝。

不要硬編碼同一代碼的9行!

  • 可讀性
  • 靈活性/維護
  • 碼長

這是過早的微優化。 在這種情況下,請始終尋求更清晰的解決方案-因此請使用for循環:)順便說一下,考慮明天的網格是否為4x4 :)

節省時間:可以忽略不計。 可能無法衡量。

首選樣式:嵌套循環。 好的,您可能永遠都不會把它變成4x4或5x5或3d(或4d!)井字游戲-但這是一個很好的習慣。 還可以更輕松地查看是否忘記了某些內容,並避免了剪切和粘貼錯誤。

具有諷刺意味的是,對檢查進行硬編碼可能會更快,但是(這是重要的一點) 毫無意義

因此,您真正應該瞄准的是最大程度地明確您要實現的目標。 另外,您應該嘗試使生活更輕松,以便將來進行任何改進(這可能是您無法進行的。)例如,如果井字游戲網格擴展到4x4,哪種解決方案是最好的?

在此基礎上,我很想使用循環方法以及適當級別的注釋等。

我們應該忘記效率低下的問題,例如大約97%的時間:過早的優化是萬惡之源。 -唐納德​​·努斯

絕對是第一個。 首先,性能差異絕對可以忽略不計-我猜是展開的程序運行速度會變慢,因為編譯/解釋它需要更長的時間,因為它更長 (因此,額外的客戶端,服務器和路由器的處理能力和帶寬會增加)。需要)。

其次,作為概括,您不知道哪個版本會更快。 也許某些解釋器會為第一個版本增加寄存器,但為第二個版本從內存中加載參數(速度較慢)?

尤其是在JavaScript的情況下,絕對沒有關於解釋器和編譯器的工作速度(未來!)的固定規范,因此,這種“優化”是毫無意義的,這會使其他程序員充其量只能充其量。

請不要對其進行硬編碼。 千萬不要那樣做。

不止一次? 使用循環。

另外,您確實在擔心自己沒有的問題。

正如您提到的,節省的時間可以忽略不計。 即使您將柵格設置為100乘以100平方,您仍然看不到任何區別。 如果我們再大一點,比如說10.000乘10.000,我們可能會看到一些差異。 我不知道那會是什么,因為編譯器和優化器非常好,尤其是在循環中,環境可能會通過擁有此信息來加快處理速度(函數將被調用多次)。

您為什么不嘗試一下並與我們分享您的結果呢?

實際上,我永遠不建議采用第二種方法。 可讀性和靈活性遠比CPU時間重要。 正如他們所說,盡早進行優化本身就是很邪惡的,因為它會使代碼混淆,並引入了許多不必要的復雜性,而並沒有真正提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM