Performance 当循环通过数百行时,如何提高速度?
我试着循环一张工作表,计算出职位的先进先出成本基础。我的工作表现在只有120行,但它无疑会随着时间的推移而增长。这个函数的执行速度已经相当慢了,所以我正在寻找如何加速它的解决方案。我也是一名noob程序员,这是我第一次使用javascript,所以任何其他建议都将不胜感激 谢谢Performance 当循环通过数百行时,如何提高速度?,performance,loops,google-apps-script,fifo,Performance,Loops,Google Apps Script,Fifo,我试着循环一张工作表,计算出职位的先进先出成本基础。我的工作表现在只有120行,但它无疑会随着时间的推移而增长。这个函数的执行速度已经相当慢了,所以我正在寻找如何加速它的解决方案。我也是一名noob程序员,这是我第一次使用javascript,所以任何其他建议都将不胜感激 谢谢 function FifoCostBasis(symbol, quantity) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.
function FifoCostBasis(symbol, quantity) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Transactions Import");
var lastRow = 150;
var lastCol = 12;
var costBasisSold = Number(0);
var quantitySold = Number(0);
for (var row = lastRow; row >= 2; row--){
var action = sheet.getRange(row,2).getValue();
var sym = sheet.getRange(row,3).getValue();
var qSold = Number(sheet.getRange(row,5).getValue());
var cbSold = Number(sheet.getRange(row,10).getValue());
var price = Number(sheet.getRange(row, 6).getValue());
if(["Buy", "Reinvest Shares", "Short Term Cap Gain Reinvest",
"Qual Div Reinvest", "Long Term Cap Gain
Reinvest"].indexOf(action)>=0
&& sym == symbol){
quantitySold += qSold;
costBasisSold += cbSold;
if(quantitySold > quantity){
var difference = quantitySold - quantity;
var cbSoldAdj = difference*price;
quantitySold = quantitySold - difference;
costBasisSold = costBasisSold - cbSoldAdj;
};
};
};
return costBasisSold;
};
您应该尽量减少对getValue的调用。与其一次只获取一个值,不如下拉一个值数组
var data = sheet.getRange(2, 1, lastRow, lastCol).getValues();
这将返回一个Javascript数组对象。需要记住的一点是,Javascript数组从索引值0开始
var row2 = data[0]; //Since we the range started at row 2, row 2 will be at position 0.
var row2col1 = row[0][0];
如果使用数组中的值,处理过程将快得多。类似的方法可能适合您:
function FifoCostBasis(symbol, quantity) {
if(symbol && quantity){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sh=ss.getSheetByName("Transactions Import");
var lastRow=150;//there is a sh.getLastRow() function that might work for you
var lastCol=12;//there is a sh.getLastColumn() function that might work for you
var rg=sh.getRange(2,1,149,12);//row 2, column 1, num rows = 150-2+1, 12 columns
var vA=rg.getValues();//all data for the entire sheet is acquired here
var costBasisSold=0;
var quantitySold=0;
for(var i=vA.length-1;i>=0;i++){//i=0 is row 2
var action=vA[i][1];
var sym=vA[i][2];
var qSold=Number(vA[i][4]);
var dbSold=Number(vA[i][9]);
var price=Number(vA[i][5]);
if((["Buy","Reinvest Shares","Short Term Cap Gain Reinvest","Qual Div Reinvest","Long Term Cap Gain Reinvest"].indexOf(action)>=0) && sym==symbol){
quantitySold += qSold;
costBasisSold += cbSold;
}
if(quantitySold > quantity) {
var difference = quantitySold - quantity;
var cbSoldAdj = difference*price;
quantitySold = quantitySold - difference;
costBasisSold = costBasisSold - cbSoldAdj;
}
}
return costBasisSold;
}else{
throw('Error: Invalid Inputs in function FifoCostBasis');
}
}
可能重复的好,我会试试这个。非常感谢。我只是做了一个小编辑。注意选择范围后对getValues的调用。