【问题标题】:Office.js Performance: How much should I put into one Excel.run function?Office.js 性能:我应该在一个 Excel.run 函数中投入多少?
【发布时间】:2017-06-08 16:57:03
【问题描述】:

我正在处理一些大型电子表格(约 30,000 行),遇到了一些性能问题,并且有以下一些与性能相关的问题:

我可以在一个Excel.run 函数中塞进多少,或者更好的是,我应该塞进多少?在确定何时将事情拆分为多个Excel.run 呼叫时,我需要考虑哪些事项?

一般来说,我应该在一次调用中创建多少个范围?

在可能需要将一个大范围拆分为多个较小范围之前,我应该使用多大的范围?

致电await ctx.sync() 或多或少会对此有所帮助吗?


编辑: 这个问题的动机是:https://stackoverflow.com/a/44424045/3806701

【问题讨论】:

  • 你能解释一下-1,这样我以后可以做得更好吗?谢谢。
  • 这是一个非常好的问题。不过,要做到公正需要一个相当长的答案,所以让我试着在几天内给出一个详细的答案。
  • 听起来不错。非常感谢您的时间和帮助。
  • 一般来说,在我的顶级函数中使用Excel.run只有一次更好(并将 ctx 传递给嵌套函数)还是使用Excel.run 更好在每个嵌套函数内部还是重要?
  • 很抱歉没有尽快回复,我本来打算回到这个帖子,但它没有引起我的注意。请在下面查看我的答案。

标签: office-js excel-2016


【解决方案1】:

很抱歉没有尽快回到这个帖子。

几个观察:

  1. 如果您要操作大量 范围(范围很特殊),您肯定希望在尽可能大的块中进行操作(例如,将值设置为一个巨大的数组在单个范围内,而不是逐个单元格设置值并创建一堆 Range 对象)。 任何新 API 对象的创建并不便宜,但 Excel 范围尤其并不便宜。团队目前正在调查一些性能问题,等我们完成调查后,我应该可以分享更多。

  2. 就内部实现而言,您可以将Excel.run 视为任务容器(可能类似于C# 中的"using" 语句)?特别是对于 Ranges,如果你超过几千个(你可以尝试一下),事情确实开始显着放缓。因此,从这个角度来看,您确实希望尽快发布您的Excel.run(不要暂停 10 分钟等待用户输入),并且 - 直到我们根据我上面提到的调查找到解决方法-- 您可能确实希望将您的Excel.run-s 保持在相当小的范围内,以减少内存占用。

  3. 话虽如此,除非您在 1000 个 API 对象上创建 1000 个,否则在正常情况下,每个“context.sync”或“Excel.run”都是进程边界或网络往返。因此,从这个角度来看,将上下文传递给辅助函数比在 Excel.run-s 上拥有几个不同的独立等待更可取。

如需更多信息,我鼓励您阅读 Yours Truly 的一本书 Building Office Add-ins using Office.js(但所有利润都用于慈善事业,因此当我向人们推荐这本书时,我不必感到内疚 :-))。如果您好奇的话,有一个很长(11 页)的关于内部实现的部分,特别是对于 Range,您可能会发现阅读“一个特殊(但常见)的情况:没有 ID 的对象很有趣”。您可能还会发现“更复杂的 context.sync 示例”部分很有用,尤其是围绕我规定的“跨多个子例程拆分工作”的模式

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2010-10-06
    • 2010-10-06
    • 2017-11-11
    • 2011-12-23
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多