测量电子表格内置函数的执行时间

Measurement of execution time of built-in functions for Spreadsheet

Spreadsheet内置函数完成后,有没有方法可以测量执行时间?当我使用几个内置函数(例如 IMPORTHTML 和 IMPORTXML)时,如果我知道平均执行时间,我就可以很容易地使用和设计数据 sheet.

我使用这个脚本测量自定义函数。

function myFunction() {
  var start = new Date();

  // do something

  var end = new Date();
  var executiontime = end - start;
}

非常感谢您的宝贵时间和建议。

Google Google 表格不包含用于测量重新计算时间的内置工具。

一种替代方法是使用 Chrome Developers Tools Timeline but bear in mind that functions like IMPORTHTML and IMPORTXML are not recalculated every time that the spreadsheet does (reference Set a spreadsheet’s location and calculation settings).

相关问答

所以

  • Google spreadsheet constantly recalculates functions

Web 应用程序

遗憾的是,没有用于检索内置函数执行时间的测量工具。 @Rubén 已经对此进行了评论。所以我想到了解决方法。以下解决方法如何?

流量:

  1. 将值导入单元格。该值是任何好的,因为它被用作触发器。请您自己完成。
    • 自定义函数无法使用 setValue()。所以我用了onEdit().
  2. func1() 导入一个公式,您希望通过触发器启动的脚本来测量执行时间。
  3. func2(),设置公式后,开始测量。内置函数完成时的确认使用循环进行。
    • 通过测量 getValue() 的每次调用成本,发现大约是 0.0003 秒。所以我觉得这个可以用。
  4. 测量结果可以在 Stackdriver 上看到,以毫秒为单位。

示例脚本:

function func1(range, formula){
  range.setFormula(formula);
}

function func2(range){
  var d = range.getValue();
  while (r == d) {
    var r = range.getValue();
  }
}

function onEdit(){
  var formula = '### Built-in function ###'; // Please set the built-in function you want to measure the execution time.

  var label = "Execution time for built-in functions.";
  var ss = SpreadsheetApp.getActiveSheet();
  var cell = ss.getActiveCell();
  var range = ss.getRange(cell.getRow(), cell.getColumn());
  func1(range, formula);
  console.time(label);
  func2(range);
  console.timeEnd(label);
}

注:

  • 测量时间很长的内置函数时,getValue()可能会出错。
    • 在我的环境中,内置函数 10 秒工作正常。

2020 年 11 月 11 日更新:

作为附加信息,我想再添加一个示例脚本,用于测量 Spreadsheet 的内置函数何时完成的执行时间以及使用该脚本的结果。

这是一个简单的示例脚本,用于测量单元格上函数的处理成本。起初,为了确认这个脚本是否可以用于测量单元格中放置的函数的处理成本,使用了自定义函数。因为在使用自定义函数的时候,可以通过Utilities.sleep(time).

知道脚本的处理时间

示例脚本:

测试此脚本时,请将以下脚本复制并粘贴到Google电子表格的容器绑定脚本中。当你运行main()的函数时,可以获得=SAMPLE(5000)的处理成本

// This is a sample custom formula. This is used for testing.
function SAMPLE(time) {
  Utilities.sleep(time);
  return "ok";
}

// This is a script for measuring the process cost.
function main() {
  const obj = { formula: `=SAMPLE(5000)`, returnValue: "ok" }; // Set formula and response value.

  const label = "Execution time";
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  const range = sheet.getRange("A1");
  range.clear();

  // start --- measure
  console.time(label);
  range.setFormula(obj.formula);
  SpreadsheetApp.flush();
  while (range.getDisplayValue() != obj.returnValue) {}
  console.timeEnd(label);
  // end --- measure

  range.clear();
}
  • 在此示例中,将 =SAMPLE(5000) 放入单元格后,5 秒后单元格中显示 ok 的值。 main() 测量处理时间。
  • 此示例脚本检查函数的输出值。所以请设置returnValue。请注意这一点。
  • 在Spreadsheet的公式中,将公式放入单元格后,开始测量处理时间。因此,在此示例中,我将 setFormulaflush 包括在测量的流程成本中。

实验结果:

作为实验,它显示了处理时间随着自定义函数的休眠时间的增加而变化,如上图所示。该结果表明处理时间随着休眠时间的增加而线性增加。发现处理时间最少,大于休眠时间,并且处理时间以每个休眠时间约0.5s作为偏移量较大。认为这个offset包含了setFormulaflushgetDisplayValue和while循环的过程开销。但是,从这个图像可以认为,当使用上述脚本测量各种公式的过程成本时,可以通过相对比较来比较它们。从这个结果来看,可以认为上面的脚本可以用来测量电子表格单元格中函数的执行时间。

参考:

要添加另一个选项,您可以执行以下操作:

function myFunction() {
  console.time('someFunction');

  // do something

  console.timeEnd('someFunction');
}

然后查看函数执行的 Stackdriver 日志。

示例输出为:

Jul 3, 2020, 1:03:00 AM Debug someFunction: 80ms