快速计算
Power Fx 表达式功能强大,可以自动为您执行许多后台计算。 尽管 Power Fx 为您自动执行许多操作,但可以优化您的计算,以便尽可能快地执行计算。
数据检索
使用显式列选择
默认情况下,为所有新应用启用显式列选择 (ECS) 功能。 如果未为您的应用启用此功能,您应该启用它。 ECS 会自动将检索到的列数减少为仅在应用程序中使用的列数。 如果未启用 ECS,您可能会检索超出所需数量的数据,这可能会影响性能。 有时,当应用通过集合提取数据时,列的原始世系或来源可能会丢失。 我们不知道它是否正在使用中,因此我们使用 ECS 删除它。 您通常可以在集合引用之后使用 PowerFx 表达式 ShowColumns 或在控件中使用它来强制 ECS 用于缺失的列。
在库、表和窗体上谨慎使用图像
针对库和表使用 Dataverse 缩略图版本的图像。 Dataverse 缩略图很小,大约 1 KB,作为记录的一部分内联存储,在显示集合的控件上显示时非常有用且快速。 所有其他图像引用(包括所有 SharePoint 图像)需要单独调用,并且不应放置在库或表上。 将需要单独调用的图像放置在详细信息窗体上。 考虑默认情况下永远不显示完整图像。 完整详细图像对用户来说非常有用且重要。 但是,您可以通过显式用户操作(例如按钮或导航到单独页面)向用户提供这些图像。 SharePoint 具有一系列中等大小的图像,可供在缺少完整图像的窗体上使用。 Dataverse 只有两种大小:缩略图和完整图像。
计算
使用 App.formula 拆分公式
使用 App.formulas 和命名公式有助于加快应用加载和页面导航的速度,因为它允许 Power Fx 决定何时计算公式。 这意味着它不必在 OnStart 中对其进行求值。 此外,命名公式通常也有助于提高速度。 特别是如果您有一个较长的脚本,将其分解为命名公式可以实现更高效的计算,因为 Power Fx 可以计划工作并实现重用。 有关详细信息,请参阅应用公式。
使用并发
使用并发函数以允许同时执行公式。 谨慎选择使用并发的位置。 它可以提供一定程度的加速,但如果您正在运行相互依赖的项目,则可能会导致计时和限制问题。
推迟对非阻止 UI 步骤的重大更新
对数据源的大型更新可能需要一段时间才能完成。 但用户希望 UI 能够快速将控制权归还给他们。 任务可以是顺序的(更新必须在用户可以执行其他操作之前完成),也可以是异步的(更新可以独立于用户操作完成。)
耗时的同步任务的一个示例是确认音乐会的座位。 对于大多数像这样耗时的同步任务,通常会设置一个进度条。 此 UI 实际上会阻止用户,但会确保任务在其他 UI 元素更新之前完成。 此方法可能不适用于您的应用程序。 企业通常将较长的连续步骤作为显式业务步骤来处理。 您已获准通过业务流程信号执行下一步。 一个示例是审批。 审批可能会很快,也可能会延迟。 在 UI 中,您可以通过多种方式表示该流程已完成。 您可以启用按钮,显示消息,发送电子邮件或启用 UI 的一部分(例如菜单项)。
异步任务的一个示例是完成订单。 客户更新订单篮,处理订单,然后下订单。 但在向客户提供确认装运日期之前,必须进行多次更新。 在本示例中,您无法立即轻松提供装运日期。 您可以将此部分更新推迟到稍后发送给客户的电子邮件中。
对于同步任务,您通常对 UI 阻止任务使用 Power Apps 中的代码。 例如,代码等待,直到获得返回值,然后释放进度条。 最好尽量减少此类情况的发生。 但是对于使用显式业务步骤的任务或异步任务,通常使用外部服务来完成任务,例如 Dataverse 操作、存储过程或 Power Automate 流。
适当地放置“ForAll”
如果您有一个包含 ForAll 和 collect 的表达式,如下所示:
ForAll(x, Collect(y, { … }))
然后,将其反转为
Collect(y, ForAll(x, { … }))
在第一个模式中,集合 y 上的任何依赖规则都会收到更改通知,并针对 x 的每次迭代进行求值。 在第二个模式中,这些规则仅求值一次。
考虑避免引用 Gallery.AllItems
当使用 Power Apps 时,最好避免引用 Gallery.AllItems,除非您需要用户值。 这是因为每次读取 AllItems 时,都会生成一个新的输出表。 相反,如果您只想知道加载了多少个项目,请使用 Gallery.AllItemsCount。
谨慎使用 Gallery.TemplateSize
为了确保正确呈现高度灵活的库,设置合理的默认大小非常重要。 最初,我们尝试根据此值呈现尽可能多的行。 如果将默认大小设置为 0,我们会尝试呈现所有内容,一些极端案例除外。 如果您使用公式,请确保设置公式求值结果可能为 0 时的最小值。 例如,您可以使用 Max (20, varFoo + rectBar.Height)。 这样,如果 varFoo 和 rectBar.Height 尚不可用,我们至少使用合理的值 20。
注意 DelayOutput 特别适用于搜索
在检测到更改之前有一秒钟的延迟,这使您可以完成键入,而不是每次键入时都检测更改。