Browse Source

perf(formula performance up): coding

master
liuyang 5 years ago
parent
commit
5e2a2a0c09
  1. 120
      src/global/formula.js
  2. 6
      src/index.html

120
src/global/formula.js

@ -4953,7 +4953,7 @@ const luckysheetformula = {
this.execFunctionGroup();
}
},
execFunctionGroup1: function(origin_r, origin_c, value, index, data, isForce=false) {
execFunctionGroup: function(origin_r, origin_c, value, index, data, isForce=false) {
let _this = this;
if (data == null) {
@ -5005,6 +5005,51 @@ const luckysheetformula = {
sheetData[sheet.index] = sheet.data;
}
//把修改涉及的单元格存储为对象
let updateValueOject = {};
if (_this.execFunctionExist == null) {
let key = "r" + origin_r + "c" + origin_c + "i" + index;
updateValueOject[key] = 1;
}
else{
for (let x = 0; x < _this.execFunctionExist.length; x++) {
let cell = _this.execFunctionExist[x];
let key = "r" + cell.r + "c" + cell.c + "i" + cell.i;
updateValueOject[key] = 1;
}
}
let arrayMatch = function(formulaArray, func){
for(let a=0;a<formulaArray.length;a++){
let range = formulaArray[a], cache={};
cache["r"+range.row[0]+""+range.row[1]+"c"+range.column[0]+""+range.column[1]+"index"+range.sheetIndex]
for(let r=range.row[0];r<=range.row[1];r++){
for(let c=range.column[0];c<=range.column[1];c++){
let key = "r" + r + "c" + c + "i" + range.sheetIndex;
func(key, r, c, range.sheetIndex);
// if(key in updateValueOject){
// // level = 0;
// }
}
}
}
}
let childFormulaMatch = function(formulaArray, formulaObjects){
arrayMatch(formulaArray, function(childKey){
if(childKey in formulaObjects){
let childFormulaCell = formulaObjects[childKey];
if(childFormulaCell.level==Math.max){
childFormulaCell.level = 0;
}
childFormulaCell.level += 1;
childFormulaMatch(childFormulaCell.formulaArray, formulaObjects);
}
});
}
//创建公式缓存及其范围的缓存
console.time("1");
for(let i=0;i<calcChains.length;i++){
@ -5047,29 +5092,92 @@ const luckysheetformula = {
}
}
formulaObjects[key] = formulaArray;
let level = Math.max;
arrayMatch(formulaArray, function(key){
if(key in updateValueOject){
level = 0;
}
});
formulaObjects[key] = {
formulaArray:formulaArray,
level:level,
calc_funcStr:calc_funcStr,
key:key,
r:formulaCell.r,
c:formulaCell.c,
index:formulaCell.index,
};
}
console.log(formulaObjects)
console.timeEnd("1");
console.time("2");
//计算
for(let i=0;i<calcChains.length;i++){
let formulaCell = calcChains[i];
if (_this.execFunctionExist == null) {
let key = "r" + formulaCell.r + "c" + formulaCell.c + "i" + formulaCell.index;
let formulaObject = formulaObjects[key];
if(formulaObject.level==0){
childFormulaMatch(formulaObject.formulaArray,formulaObjects);
}
}
console.log(formulaObjects)
console.timeEnd("2");
console.time("3");
let formulaRunList = [];
Object.keys(formulaObjects).forEach((key)=>{
formulaRunList.push(formulaObjects[key]);
});
formulaRunList.sort(function(a, b){
if(a.level<b.level){
return 1;
}
else{
return -1;
}
});
for(let i=0;i<formulaRunList.length;i++){
let formulaCell = formulaRunList[i];
if(formulaCell.level==Math.max){
continue;
}
}
window.luckysheet_getcelldata_cache = null;
let calc_funcStr = formulaCell.calc_funcStr;
let v = _this.execfunction(calc_funcStr, formulaCell.r, formulaCell.c, formulaCell.index);
_this.groupValuesRefreshData.push({
"r": formulaCell.r,
"c": formulaCell.c,
"v": v[1],
"f": v[2],
"spe":v[3],
"index": formulaCell.index
});
// _this.execFunctionGroupData[u.r][u.c] = value;
_this.execFunctionGlobalData[formulaCell.r+"_"+formulaCell.c+"_"+formulaCell.index] = {
v:v[1],
f:v[2]
};
}
console.log(formulaRunList);
console.timeEnd("3");
_this.execFunctionExist = null;
},
// When set origin_r and origin_c, that mean just refresh cell value link to [origin_r,origin_c] cell
execFunctionGroup: function(origin_r, origin_c, value, index, data, isForce=false) {
execFunctionGroup1: function(origin_r, origin_c, value, index, data, isForce=false) {
let _this = this;
if (data == null) {

6
src/index.html

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save