Technical Articles
SAP分析云优化故事模式的性能深入介绍与相关建议
SAP 分析云新的优化故事模式为用户提供了全新的缓存机制。 这将提高故事整体的初始加载性能。此外我们还增加了新的设置,允许故事开发者调整微件的加载顺序,从而在不同场景下实现最佳性能。本文将基于 SAP 分析云 2023.16 版本深入介绍这些机制和性能相关的注意事项和建议。
优化故事查询定义以及模型元数据缓存
当用户保存在新优化设计体验模式下创建的故事时,故事第一页的查询定义以及其所需的模型元数据将被公开缓存,供所有用户使用。这将提高故事初始加载性能,避免出现额外的往返请求。
当故事相关的模型发生变化(包括计划模型版本变更)时,缓存将会失效。当用户首次查看故事时,系统将重新生成一个私有缓存,并与故事和用户账户关联。
- 当故事被重新保存时,所有的私有缓存将被移除。
对于通过故事 page – onInitialization事件脚本修改查询的微件,缓存也将失效,例Chart.getDataSource().setDimensionFilter(dimension, members)。
当用户使用书签时:
书签将只会以 storyId 和 bookmarkId 为键生成公共缓存,
如果用户将书签配置为“仅更改了状态的微件(默认选项)”或者“故事中的所有微件”,那么“保存书签”这一动作将会为所有用户生成公共缓存。
- 当故事被重新保存时,该缓存也将无效。当用户首次查看故事时,系统将重新生成一个公共缓存,并与故事和书签关联。
如果用户将书签配置为“仅所选微件”,那么“保存书签”这一动作将不会生成缓存。
- 当用户首次查看故事时,系统将重新生成一个公共缓存,并与故事和书签关联。
当用户使用书签Apply()脚本API加载书签时,将不会消耗或生成缓存。
当用户重新保存故事时,所有与书签相关联的缓存都将被移除。
性能相关设置
名词解释
可查看微件是指:
- 微件位于屏幕视口内。
- 微件本身及其父容器均可见
- 未打开弹出窗口中的微件不可见
微件被创建是指:
- 微件实例被创建
- 微件实例可以通过脚本访问
- 微件正在等待渲染
微件已加载是指:
- 微件被创建
- 微件已加载其查询数据
- 微件已经完成渲染
微件数据刷新的决定顺序
是否通过“正在加载优化设置”加载微件?
当微件加载以后,是否暂停了数据刷新选项?
正在加载优化设置
一.无
1.所有微件都会在故事初始化阶段加载
2.所有微件加载完毕后,将触发 故事 page – onInitialization脚本。
二.后台加载
- 提示:部分微件不支持后台加载:如
- 响应式通道
- 启用交叉微件功能的图表(如比例对齐、动态文本引用)
- 带有与模型维绑定的动态文本的文本微件
- 移动设备中故事级别的输入控件
- 带有不支持后台加载微件的微件容器
2.只有“可查看微件”和“不支持后台加载”的微件可以在故事初始化阶段加载。
- 注意:弹出窗口内的微件将被视为“不可查看微件”,因此其无法在故事初始化阶段被加载。
3.当“可查看微件”开始加载,故事 page – onInitialization 事件脚本将被触发。
4.当故事 page – onInitialization 事件脚本被执行时:
- “不可查看微件”将会逐个加载
- 表格不支持批量查询。因此后台加载多个表格的总加载时间可能比默认加载更长。
- 推荐:如果您希望通过脚本访问表格,我们建议强制表格微件及其父类“始终在启动时初始化”。如果您担心其设置了“始终在启动时初始化”的父类会强制其他微件在故事 page – onInitialization事件之前加载,您可以将表格放置在一个特殊的面板容器中。当最终用户想要查看这些表格时,您可以使用Panel.moveWidget() 脚本 API 将这些表格移回至相应的容器。
- 表格不支持批量查询。因此后台加载多个表格的总加载时间可能比默认加载更长。
-
- 图表、地理地图、输入控件以及带有动态文本的文本微件支持批量查询。因此他们的加载时间和默认加载相似。
- 注意:由于Javascript采用了单线程执行机制,这些微件将在故事 page – onInitialization事件脚本异步执行期间加载和渲染(举例而言:在脚本等待远程调用返回数据期间),因此故事 page – onInitialization事件脚本的总执行时间将会相应延长。
- 注意:在故事 page – onInitialization事件脚本执行阶段,如果脚本调用引用了一个仍未被加载的微件,该脚本调用将被保留,等待微件加载完成,随后再执行脚本调用。
- 推荐:在故事 page – onInitialization事件脚本尽可能少地引用“不可查看微件”,以加速执行过程。
5.故事 page – onInitialization 事件脚本被成功执行以后
- 终端用户可以查看故事内容并与微件交互
- 部分“后台加载”微件可能仍在加载中
- 注意:Chart and Table – onResultChange事件只有在完成首次数据查询后才会触发。
6.例外情况:强制微件“始终在启动时初始化”(视口加载或后台加载时除外)
- 当微件在其样式面板上启用了“始终在启动时初始化”时,它将被“视口加载”或“后台加载”的检查逻辑视为实际可见。
- 如果一个微件不可查看,那么在故事初始化阶段强制初始化该微件时,该微件的所有父微件都应当是可查看的或者启用了“始终在启动时初始化”。
- 无论是否启用了“始终在启用时初始化”,弹出窗口内的微件都将被视为不可查看微件。
当微件位于画布上:
微件于视口内 | 微件可见性 | 始终在启用时初始化 | 创建微件阶段 |
是 | 可见 | 未开启 | 初始化 |
是 | 可见 | 开启 | 初始化 |
是 | 不可见 | 未开启 | 后台 |
是 | 不可见 | 开启 | 初始化 |
否 | 可见 | 未开启 | 后台 |
否 | 可见 | 开启 | 初始化 |
否 | 不可见 | 未开启 | 后台 |
否 | 不可见 | 开启 | 初始化 |
当微件位于容器微件内:
容器创建阶段为初始化 | 微件于隐藏选项卡条内或者页簿页面内 | 微件于视口中 | 微件可见性 | 始终在启用时初始化 | 创建微件阶段 |
是 | 否 | 与画布上的微件相同 | |||
是 | 是 | 不适用/不可用 | 任意 | 未开启 | 后台 |
是 | 是 | 不适用/不可用 | 任意 | 开启 | 初始化 |
否 | 任意 | 任意 | 任意 | 任意 | 后台 |
三.视口加载
- 支持视口加载的微件:图表、表格、地理地图、输入控件、带有动态文本的文本微件
- 其他微件的行为与“后台载入”选项相同
2.在故事初始化阶段,只加载可查看的微件。
- 注意:弹出窗口内的微件将被视为“不可查看微件”,因此其无法在故事初始化阶段被加载。
3.在可查看微件开始加载,故事 page – onInitialization 事件脚本被触发
4.当故事 page – onInitialization 事件脚本被执行时:
- 支持视口加载的不可查看微件(图表、表格、地理地图、输入控件、带有动态文本的文本微件):
- 这些被脚本引用的微件将逐个加载
- 表格不支持批量查询。因此后台加载多个表格的总加载时间可能比默认加载更长。
- 图表、地理地图、输入控件以及带有动态文本的文本微件支持批量查询。因此他们的加载时间和默认加载相似。
- 注意:通过 Application.getWidgets() 脚本 API 获取的微件无法识别为脚本引用的微件。
- 注意:在 2023.16 (QRC3) 中,使用 Application.getWidgets() API 按表格类型搜索微件会强制加载所有表格微件。该情况计划于 2023.QRC4 版本中进行修复。
- 这些被脚本引用的微件将逐个加载
-
- 不支持视口加载的不可查看微件
- 与“后台加载”选项一样,这些微件将会逐个加载。
- 请注意下列情况
- 注意:由于Javascript采用了单线程执行机制,这些微件将在故事 page – onInitialization事件脚本异步执行期间加载和渲染(举例而言:在脚本等待远程调用返回数据期间),因此故事 page – onInitialization事件脚本的总执行时间将会相应延长。
- 注意:在故事 page – onInitialization事件脚本执行阶段,如果脚本调用引用了一个还未加载的微件,那么该脚本调用会暂时保留,待微件加载完成后再执行该脚本调用。
- 不支持视口加载的不可查看微件
- 当故事 page – onInitialization 事件脚本被执行时:
-
- 终端用户可以查看故事内容并与微件交互
-
- 部分“后台加载”微件可能仍在加载中
-
- 当用户进行交互(如滚动页面或者更改可见性)时,一个支持视口加载件且不被脚本引用的不可查看微件变为可见,该微件将会被加载。
- 例外情况:强制微件“始终在启动时初始化”(视口加载或后台加载时除外)
-
- 当微件在其样式面板上启用了“始终在启动时初始化”时,它将被“视口加载”或“后台加载”的检查逻辑视为实际可见。
-
- 如果一个微件是不可查看的,在故事初始化时对其进行强制初始化,那么其所有的父微件应当是可查看的,或者已启用“始终在启用时初始化”功能。
-
- 无论是否启用了“始终在启用时初始化”,弹出窗口内的微件都将被视为不可查看微件。
-
- 保存书签将加载和渲染所有微件,然后恢复其最初的视口加载状态。
当微件位于画布上
脚本引用 | 微件于视口内 | 微件可见性 | 始终在启用时初始化 | 微件是否会被加载? |
否 | 是 | 可见 | 未开启 | 是 |
否 | 是 | 可见 | 开启 | 是 |
否 | 是 | 不可见 | 未开启 | 否 |
否 | 是 | 不可见 | 开启 | 是 |
否 | 否 | 可见 | 未开启 | 否 |
否 | 否 | 可见 | 开启 | 是 |
否 | 否 | 不可见 | 未开启 | 否 |
否 | 否 | 不可见 | 开启 | 是 |
是 | 任意 | 任意 | 任意 | 是 |
当微件位于容器内
容器微件 | 微件自身 | ||||||
脚本引用 | 是否可查看 | 始终在启用时初始化 | 微件于隐藏选项卡条内或者页簿页面内 | 微件于视口内 | 微件可见性 | 始终在启用时初始化 | 微件是否会被加载 |
否 | 是 | 任意 | 否 | 与画布上的微件相同 | |||
否 | 是 | 任意 | 是 | 无 | 任意 | 任意 | 否 |
否 | 否 | 否 | 任意 | 任意 | 任意 | 任意 | 否 |
否 | 否 | 是 | 否 | 任意 | 任意 | 未启用 | 否 |
否 | 否 | 是 | 否 | 任意 | 任意 | 启用 | 是 |
否 | 否 | 是 | 是 | 任意 | 任意 | 任意 | 否 |
是 | 任意 | 任意 | 任意 | 任意 | 任意 | 任意 | 是 |
当微件于关闭的弹出窗口中
脚本引用 | 是否可查看 | 始终在启用时初始化 | 微件于隐藏选项卡条内或者页簿页面内 | 微件于视口内 | 微件可见性 | 始终在启用时初始化 | 微件是否会被加载 |
否 | 任意 | 任意 | 任意 | 任意 | 任意 | 任意 | 否 |
是 | 任意 | 任意 | 任意 | 任意 | 任意 | 任意 | 是 |
当微件于开启的弹出窗口中
脚本引用 | 是否可查看 | 始终在启用时初始化 | 微件于隐藏选项卡条内或者页簿页面内 | 微件于视口内 | 微件可见性 | 始终在启用时初始化 | 微件是否会被加载 |
任意 | 任意 | 任意 | 任意 | 任意 | 任意 | 任意 | 是 |
当弹出窗口开启且微件位于画布上
脚本引用 | 是否可查看 | 始终在启用时初始化 | 微件于隐藏选项卡条内或者页簿页面内 | 微件于视口内 | 微件可见性 | 始终在启用时初始化 | 微件是否会被加载 |
否 | 任意 | 任意 | 任意 | 任意 | 任意 | 任意 | 否 |
是 | 任意 | 任意 | 任意 | 任意 | 任意 | 任意 | 是 |
总结
如果您是不需要高级脚本功能的故事设计者,我们建议您使用默认的“正在加载优化设置” =“视口加载”。
如果您是需要高级脚本功能的故事设计者,我们建议您:
- 根据您的故事设计需求和场景,平衡初始加载时间和终端用户的首次交互响应时间。
- 通过设置微件及其父级 始终在启用时初始化=true,确认哪些微件应在页面开始时加载 – onInitialization 脚本访问。
- 在故事 page- onInitialization 事件的脚本中尽量少引用不可查看的微件。
原文链接:SAP Analytics Cloud New Optimized Story Performance Deep Dive and Recommendations | SAP Blogs
原作者:Jove Shi