【问题标题】:Google App Script: identify performance/execution speed bottleneck part of the codeGoogle App Script:识别代码的性能/执行速度瓶颈部分
【发布时间】:2021-02-07 09:14:21
【问题描述】:

Google App Script:识别代码的性能/执行速度瓶颈部分。 就技术而言,任何人已经在这方面取得了一般性的成功吗?你能分享你的例子吗?

下面是我从 Google ClassRoom 输出带有简单表格的 HTML 网页的小脚本。 到目前为止,我对这些技术还很陌生,但我正在努力在学习上取得进步。

此脚本最多可输出 100-150 个表格行。无法理解为什么脚本运行超过 5-8 分钟才能完成其工作并最终输出那些 100-150 行的 HTML 表格。

也许我使用数组错误的方式或其他什么? 或者可能是 Google App Script 的本质是整体运行缓慢?

function doGet() {
  var res = listCoursesHTML();
  var html = HtmlService.createHtmlOutput();
  html.append("<table border = \"1\">");
  html.append("<tr><th>Имя преподавателя</th><th>Почта</th><th>Название курса</th><th>Название ОП (Учебная группа)</th></tr>");
  for(result in res)
  {
    html.append("<tr><td>"+res[result].Name +"</td><td>"+res[result].email +"</td><td>"+res[result].courseName +"</td><td>" +res[result].courseDescription+"</td></tr>");
  }
  html.append("</table>");
  //return HtmlService.createHtmlOutput(out[0]);
  return html;
}

function listCoursesHTML() {
  var courses = [];
  var ownerId = [];
  var pageToken = null;
  var optionalArgs = {
    pageToken: pageToken,
    pageSize: 9999
  };
  var results = [];

  while (true) {
    var response = Classroom.Courses.list(optionalArgs);
    // @ts-ignore
    var courses = response.courses;
    if (!pageToken) {
       break;
    }
  }
  if (courses.length === 0) {
    Logger.log("No courses found.");
  } else {
    Logger.log("Courses:");
    // @ts-ignore
    for (course in courses) {
      // @ts-ignore
      results.push({
        "Name": getName(courses[course].ownerId),
        "email": getEmail(courses[course].ownerId),
        "courseName": courses[course].name,
        "courseDescription": courses[course].description
        });
    }
  }
  return results;
}

function getEmail(id) {
  return Classroom.UserProfiles.get(id).emailAddress;
}

function getName(id) {
  return Classroom.UserProfiles.get(id).name.fullName;

}


【问题讨论】:

  • 我不太确定,但如果它发生在我身上,我会尝试用标准 for 循环或 forEach 方法替换 for in 循环。此外,在将 html 应用到 htmlService 之前,我会在 for 循环中将 html 构建为字符串,并避免使用 append 方法。但是代码对我来说似乎没问题,但你有 javascript 标签很好,因为你可能迟早会得到比我更了解代码的人来回答。

标签: javascript google-apps-script google-classroom


【解决方案1】:

Apps 脚本在 best practises 上提供了一个很好的指南,以保持您的代码干净,特别是为了保持它的效率。

  • 可能与您的案例场景相关的一个方法是使用Batch operations,而不是一个一个地设置元素。

  • 另外,在使用潜在的无限循环 (while(True)) 时请非常小心,并尝试将其替换为 if if(pageToken) 或一段时间,具体取决于变量 while(pageToken)

  • 正如@Cooper 提到的,不建议将for in 用于迭代数组,因为它被设计为迭代对象的属性,因此在将其与数组一起使用时其性能可能会降低。如this literature 中所述,最好对数组使用简单的for 循环或forEach 循环。

  • 最后,我建议您进一步阅读并在 appendinnerHtmlhtml() 之间进行性能测试,因为根据具体情况,它们的性能可能会更好。

【讨论】:

    猜你喜欢
    • 2017-02-02
    • 2022-01-06
    • 1970-01-01
    • 2011-06-17
    • 2012-11-15
    • 2021-05-02
    • 2019-02-12
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多