AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77494742
Accepted
Danko
Danko
Asked: 2023-11-16 20:19:51 +0800 CST2023-11-16 20:19:51 +0800 CST 2023-11-16 20:19:51 +0800 CST

为什么优化后的 g 脚本代码比“低效”的代码慢?

  • 772

一个电子表格有一个 50x36 的数组,其中包含值。如果 col+1 单元格大于 0,该函数应该从某些列获取值并构建一个数组。代码的第一部分是调用一次页面,获取一行中的所有值,然后使用嵌套的 for 和 if,创建所需的数组。第二部分是做完全相同的事情,但是使用 getValues() 多次调用页面,这应该会更慢,而且根据谷歌的说法,这不是一个好的做法。第一个输出结果比第二个慢 100 毫秒。有人可以解释一下吗?

function PieseArray() {
  
  let pag = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Configuracion');

//start counting time for the first part
  let start1 = new Date
  let allTheParts = pag.getRange(11,40,50,36).getValues()
  let array2=[]
  for (let i=0;i<36;i=i+4){
    for (let j=0;j<allTheParts.length;j++){
      if(allTheParts[j][i+1]>0){
        array2.push([allTheParts[j][i],allTheParts[j][i+1]])
      }
    }
  }
  let end1 = new Date
  Logger.log(end1-start1)
  
//start of the second part 
let start2 = new Date
let piese = []
for(let k=40;k<=72;k=k+4){
  piese = piese.concat(pag.getRange(11,k,50,2).getValues())
}
  let array1=[]
  for (let i=0;i<piese.length;i++){
    if(piese[i][1]!=''){
      array1.push(piese[i])
    }
  }
  let end2 = new Date
  Logger.log(end2-start2)

  return(array1)
}

执行日志

1:06:11 PM  Notice  Execution started
1:06:12 PM  Info    107.0 (first part)
1:06:12 PM  Info    15.0 (second part)
1:06:12 PM  Notice  Execution completed

结果是相同的数组,但执行时间很奇怪。我预计代码的第二部分会慢得多。

performance
  • 2 2 个回答
  • 39 Views

2 个回答

  • Voted
  1. Cooper
    2023-11-16T20:45:26+08:002023-11-16T20:45:26+08:00

    试试这样:

    function myFunction() {
      const ss = SpreadsheetApp.getActive();
      let sh = ss.getSheetByName('Configuracion');
      //start counting time for the first part
      let dt1 = new Date();
      let vs = sh.getRange(11, 40, 50, 36).getValues()
      let arr1 = []
      for (let i = 0; i < 36; i = i + 4) {
        for (let j = 0; j < vs.length; j++) {
          if (vs[j][i + 1] > 0) {
            arr1.push([vs[j][i], vs[j][i + 1]])
          }
        }
      }
      let dt2 = new Date();
      Logger.log(myTimeDiff(dt1,dt2));
    
      //start of the second part 
      let dt3 = new Date
      let arr2 = []
      for (let k = 40; k <= 72; k = k + 4) {
        arr2 = arr2.concat(sh.getRange(11, k, 50, 2).getValues())
      }
      let arr3 = []
      for (let i = 0; i < arr2.length; i++) {
        if (arr2[i][1] != '') {
          arr3.push(arr2[i])
        }
      }
      let dt4 = new Date()
      Logger.log(myTimeDiff(dt3,dt4))
      return (arr3)
    }
    
    function myTimeDiff(Start, End) {
      if (Start && End) {
        var second = 1000;
        var minute = 60 * second;
        var hour = minute * 60;
        var day = hour * 24;
        var t1 = new Date(Start).valueOf();
        var t2 = new Date(End).valueOf();
        var d = t2 - t1;
        var days = Math.floor(d / day);
        var hours = Math.floor(d % day / hour);
        var minutes = Math.floor(d % day % hour / minute);
        var seconds = Math.floor(d % day % hour % minute / second);
        return 'dd:hh:mm:ss\n' + days + ':' + hours + ':' + minutes + ':' + seconds;  
        //return d / day;
        //return hours + minutes/60;
      }
      else {
        return 'Invalid Inputs';
      }
    }
    
    • 日期.valueOf()
    • google-apps-脚本参考
    • JavaScript 日期对象
    • JavaScript 参考
    • 了解更多
    • 欢迎来到 StackOverflow
    • 0
  2. Best Answer
    TheMaster
    2023-11-16T21:29:32+08:002023-11-16T21:29:32+08:00

    两个代码都没有做同样的事情。主要比较的是不同。

    if(allTheParts[j][i+1]>0){

    不同于

    if(piese[i][1]!=''){

    此外,Apps 脚本具有先行缓存功能,您需要的值已经被缓存。如果您依次运行代码,从同一范围获取相同的值,则从第一个代码缓存的值将在第二个代码中使用。

    为了正确计时这些功能,

    • 使用两个不同的函数 - 每次都一个接一个地调用它们。确保在调用下一个函数之前完全停止每个函数的执行。
    • 使用内置console.time和console.timeEnd来正确计时功能
    • 确保这两个代码执行相同数量和类型的操作。不仅仅是输出相同。
    • 每个测试运行三次或更多次。
    • 0

相关问题

  • 如何让JMeter用户不等待响应

  • 如何解释两个处理器之间巨大的执行速度差异?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve