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

Posted

技术标签:

【中文标题】测量电子表格内置函数的执行时间【英文标题】:Measurement of execution time of built-in functions for Spreadsheet 【发布时间】:2017-10-25 04:00:42 【问题描述】:

当电子表格的内置函数完成时,是否有测量执行时间的方法?当我使用几个内置函数(例如,IMPORThtml 和 IMPORTXML)时,如果我知道平均执行时间,我很容易使用和设计数据表。

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

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

  // do something

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

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

【问题讨论】:

您可以在脚本编辑器视图菜单中查看执行记录。 相关:What's causing / how to get rid of long web calls in Google Spreadsheets @Cooper 非常感谢您的评论。当我运行 Google Apps 脚本时,我可以在 Execution Transcript 中获得它。但是当我在电子表格上运行内置函数时,我无法得到它。我该怎么办? @Rubén 非常感谢您的评论。我检查了它。作为一种间接测量方法,这对我来说很重要。直接测量难吗? 我使用了另一种没有自定义函数的方法来衡量使用范围作为参数的任何公式的性能:webapps.stackexchange.com/questions/126651/… 【参考方案1】:

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

流程:

    将值导入单元格。该值是任何好东西,因为它被用作触发器。请自己做。 自定义函数不能使用setValue()。所以我使用了onEdit()func1() 导入一个公式,您想通过触发器启动的脚本来测量执行时间。 func2(),设置公式后,开始测量。内置功能完成时的确认使用循环进行。 通过测量getValue() 的每次调用成本,发现大约为 0.0003 秒。所以我觉得这个可以用。 可以在 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 日更新:

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

这是一个简单的示例脚本,用于测量单元上函数的过程成本。起初,为了确认这个脚本是否可以用来衡量放入一个单元格中的函数的过程成本,使用了一个自定义函数。因为在使用自定义函数时,通过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) 放入单元格时,ok 的值会在 5 秒后显示在单元格中。 main() 测量处理时间。 此示例脚本检查函数的输出值。所以请设置returnValue。请注意这一点。 在电子表格的公式中,当将公式放入单元格时,开始测量处理时间。所以在这个示例中,我将setFormulaflush 包括在测量的流程成本中。

实验结果:

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

参考:

Benchmark: Measuring Process Costs for Formulas in Cells on Google Spreadsheet using Google Apps Script

【讨论】:

【参考方案2】:

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

另一种方法是使用Chrome Developers Tools Timeline,但请记住,IMPORTHTML 和 IMPORTXML 等函数不会在每次电子表格执行时都重新计算(参考 Set a spreadsheet’s location and calculation settings)。

相关问答

所以

Google spreadsheet constantly recalculates functions

网络应用程序

What's causing / how to get rid of long web calls in Google Spreadsheets Where does the calculation take place?

【讨论】:

感谢您的建议。这对于间接了解执行时间很有用。但是 Tanaike 的解决方法对于直接了解它很有用。我可以获得平均执行时间。我接受了他的回答作为解决方案。我赞成你的回答。【参考方案3】:

要添加另一个选项,您可以这样做:

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

  // do something

  console.timeEnd('someFunction');

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

示例输出为:

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

【讨论】:

以上是关于测量电子表格内置函数的执行时间的主要内容,如果未能解决你的问题,请参考以下文章

C#如何测量函数时间执行[重复]

如何在golang中测量函数的执行时间,不包括等待时间

在 R 中测量函数执行时间

在 R 中测量函数执行时间

在 R 中测量函数执行时间

在 R 中测量函数执行时间