通过建模决策的结果进行思考是确保良好模型性能的关键部分。换句话说,确保计算引擎不会超过。本文重点介绍了如何减少计算引擎负载的一些想法。
公式应该很简单;嵌套或使用多种组合的公式使用有价值的处理时间。编写长长的,涉及的公式会使引擎努力工作。当用户盯着屏幕时,秒数。简单更好。分解公式并使用其他选项有助于快速保持处理速度。
在模型中使用这些技术时,您必须保持平衡,因此指导如下:
公式的结构可以与模型中的输入更改时发生的计算量有显着影响。考虑以下计算应用程序中总利润的示例。有五个要素构成了计算:产品销售,服务销售,销售成本(COG),运营支出(OP EX)以及租金和公用事业。每个不同的元素都在单独的模块中计算。报告模块将结果汇总到总利润订单项中,该项目使用下面显示的公式计算出来。当COGS的一个组件发生变化时会发生什么?由于所有源组件都包含在公式中,当任何组件中的任何内容都会更改时,该公式就会重新计算。如果有大量的组件表达式,则可以在计算引擎上占用比必要的更大的开销。
有一种简单的方法来构建模块来减少对计算引擎的需求。您可以通过为每个组件创建一个订单项,并将总利润公式作为单独的行项目添加总利润公式来分开报告模块中的输入行。这样,更改对源数据仅导致相关行项目重新计算。
例如,产品销售计算的更改仅影响产品销售和报告模块中的总利润界限项目;服务销售,OP EX,COGS和租金和公用事业没有变化。同样,齿轮的变化仅影响报告模块中的齿轮和总利润。
牢记一般指南。将每个下游公式分解为单个订单项是不切实际的。
条件公式(如果/时)就模型构建器的最佳结构是对公式的最佳结构而构成的挑战,而没有使其过于复杂且难以阅读或理解。基本原则是避免使计算引擎的工作量超过必要的工作。尝试设置公式以尽快完成计算。
始终首先放置最有可能发生的状况。这样,计算引擎可以尽早退出表达式处理。
这是评估季节性营销促销的示例:
夏季促销活动持续了三个月,冬季晋升了两个月。
在没有促销的几个月里,这种公式不是最佳的,并且需要更长的时间才能计算。
这是更好的,因为公式将在第一个条件后更频繁地退出。
有一个更好的方法可以做到这一点。遵循上面的原则,添加另一个订单项以无晋升。
然后公式可以变成:
这甚至更好,因为已经计算了没有促销的计算,并且夏季促销比冬季促销更频繁。
并不总是清楚哪种情况会比其他情况更频繁地发生,但是以下是如何优化公式的一些示例:
很棒的建议!
嗨,海克
感谢您的问题和对文章的兴趣。
空白的检查非常快,但是这超过了遍历列表的时间更难证明。如果清单非常大(例如超过100万个项目),我认为值得检查。对于一小部分空白的较小列表,可能不需要。
与许多建模决策一样,答案通常是“取决于”,我们试图提出一种最佳实践,该实践将涵盖大多数情况,并提供解决方案或思维方式,如果您注意到某些绩效降低。我们已经看到了进行检查的巨大表现。
我要说的是,总是最好检查。如果您删除公式,请点击Enter,然后再次粘贴并击中Enter,这将迫使该订单项的完整重新计算。因此,将其与检查时间,然后无需时间。
让我知道您发现了什么,但是我们将进行一些内部测试,以查看是否有一个阈值,这有很大的不同。
这是一个有趣的问题,有些功能对空白进行了内置检查,但是FindItem并不是其中之一。我们已经问我们是否可以包括内置的检查,这将否定该检查的需求。
再次感谢您,因为这种对话会提示讨论并使产品更好。
这些建议很棒,但是公式经常不太易于分解或重新以这种干净的方式进行优化。当公式变得非常漫长而复杂时,很难知道在哪里以及如何将其分解成可管理的零件。是否有可能获得比上面的示例更复杂的示例,并就如何处理的最佳实践提供一些指导?我在我的客户中看到了一个在Word文档中长达三页的时间,并试图弄清楚它使我的头部旋转。
我同意我们经常看到更复杂的公式。我花了很多一天的时间试图理解和优化可怕的公式。3页很短!我看过一个50页公式。
没有简单的方法来分解它,但是我的建议如下:
1。复制公式向单词或Excel进行分析。我讨厌自己这么说,但通常会更容易分解公式的元素。y
2。看重复的表情。从上面,使用查找来突出显示重复的单词/表达式效果很好。这些是将候选人分成单独的订单项。我们经常看到公式的相同部分重复。
例如。如果x,则a / b * c else如果y,则a / d * c else 1
这里A * c在两种情况下都是常见的,因此可以分开并引用。因此,创建一个新的行项目= a * c,公式变为:
“新行项目” /如果x,则b else如果y,则d else 1
甚至更好地将其分成两个
创建另一个行项目=如果x然后b否则如果y,则d其他1
然后,原始公式是:
“新订单项目” /“另一个行项目”
3。有多个IFS时突破条件。在许多情况下,通常可以用查找来代替这些(尤其是当涉及(涉及项目...)时,但是分类各种条件使得更容易脱毛和测试以及改善性能
4。寻找“模式,变量和参数”。我们经常看到一个遵循类似构曲的公式的部分,并具有数字值作为参数的形式,例如 *3, *4, *5。这些通常可以分开并重新配置以提高效率
还请记住,如果您确实将订单项拆分,则不太可能需要打开摘要选项,因此可以最大程度地减少其他订单项的单元格数
我希望有帮助
大卫
与FindItem一起有区别
如果是iSnotblank(文本),则FindItem(列表,文本)else blank
vs
如果是iSnotblank(finditem(list,text)),则finditem(列表,文本)否则空白
性能中?