簡體   English   中英

是否值得運行兩個While循環來確定For循環的初始起點和迭代次數?

[英]Is it worth running two While loops to determine initial starting point and number of iterations for a For loop?

我有一個基本的for循環,遍歷一個值數組並在找到某個值時執行代碼。 該數組是從Google表格中獲取的一列真或假值。

// array example: [[false], [false], [false], 
//                 [true], [false], [false],
//                 [false], [true], [false],
//                 [false], [false], [false]]

for (i = 0; i < array.length; i++) {
 if (array[i][0] === true) {
  // execute code
 }

是否值得(性能方面)運行兩個While循環來確定For循環應該從哪里開始以及它應該迭代多少次,或者它基本上是否相同?

var c = array.length - 1;
while (array[c][0] === false) {
 c--;
}

var d = 0;
while (array[d][0] === false) {
 d++;
}

var start_row = d+1;
var end_row = c+1;

for (i = start_row - 1; i < end_row; i++) {
 if (array[i][0] === true) {
  // execute code
 }

這兩個For循環似乎執行完全相同,但我希望得到一些輸入,如果一個優先於另一個以及為什么。 在我看來,第二種情況更有意義,因為For循環不必從數組的最開始一直到最后都不必要地迭代,但是根據這些代碼實際編譯的方式我可能完全錯誤。執行。

提前致謝!

如果您沒有特定的需求來創建額外的循環 - 沒有太多理由這樣做。 無論如何,這兩個while循環和for循環將迭代整個數組。 提供示例的主要目標是編寫更少的代碼(我不會使用提供的代碼來提高執行速度),因此我建議只使用單個for循環來減小邏輯的大小。

Google Apps腳本的當前實現有一些有趣的怪癖,其中之一是聚合數組方法(如map()forEach()some()every()比vanilla for循環執行得更好。 我知道這在傳統智慧面前曇花一現,但在幕后工作中有一些奇怪的事情。

看一下以下片段:

var arr = [
        [false, false, false],
        [true, false, false],
        [false, true, false],
        [false, false, false]
    ];

arr.forEach(function(row){
    row.forEach(function(item){
        // do the things
    });
});

信不信由你上面的代碼可能比你的for循環執行得更快。 G + GAS社區的重要成員之一 - Kanshi Tanaike - 運行了許多基准測試並做出了這一發現。 您可以在以下鏈接查看他的發現:

https://gist.github.com/tanaikech/848aeafaac1ec676900bb78e3ce220b6

希望Apps Script在最終升級為使用Chrome的V8引擎時會以更傳統的方式運行。

沒有因為對於JS解釋為計算成本while循環是不尊重更好for辦法,而代碼獲取的可讀性。

識別“緊湊”數據的索引間隔的方法更適用於編譯語言(C / C ++),其中您(或編譯器)可以利用需要在“緊湊”數據陣列中工作的循環展開技術。

暫無
暫無

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

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