Google 应用程序脚本:识别 performance/execution 代码的速度瓶颈部分

Google App Script: identify performance/execution speed bottleneck part of the code

Google 应用程序脚本:识别 performance/execution 代码的速度瓶颈部分。 就技术而言,有人已经在这方面取得了成功吗?你能分享你的例子吗?

下面是我的小脚本,用于从 Google ClassRoom 输出带有简单 table 的 HTML 网页。 我现在对这些技术还不是很了解,但正在努力学习。

此脚本最多输出 100-150 table 行。无法理解为什么脚本 运行 需要超过 5-8 分钟才能完成其工作并最终输出那 100-150 行 HTML table.

也许我使用数组的方式有误或其他原因? 或者可能是 Google 应用程序脚本的性质 运行 整体缓慢?

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;

}


Apps 脚本在 best practises 方面提供了很好的指导,以保持您的代码整洁,特别是为了保持代码高效。

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

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

  • 如@Cooper 所述for in is not recommended to be used to iterate over arrays as it was rather designed to iterate over properties of an object and therefore its performance might get decreased when using it with arrays. As described in this literature it is better to use a simple for loop or a forEach 数组循环。

  • 最后,我建议您进一步阅读并在 append, innerHtml and html() 之间进行性能测试,因为根据具体情况,每一个在性能方面都可能更好。