传递字符串比传递对象隔离作用域快多少?



通过隔离作用域传递对象,还是通过指令传递id并在控制器内部检索资源,而不将整个内容放在作用域上,哪个更快/更高效?

IE。

的区别
<my-directive resource="resource"></my-directive>

与DDO:

    scope: {
        resource: '=' 
    }

,然后直接从

作用域使用对象

<my-directive resource-id="{{resource.id}}"></my-directive>

与DDO类似:

{scope: resourceId: '@'}

和一个ctrl,看起来有点像这样(假设通过另一个fn存在获取资源的方法):

let resource = ResourceStorage.get($scope.resourceId);

还是没有区别?

正如Shomz提到的,传递Object引用应该更快。它涉及到处理单个值(例如,引用,表示对象所在的位置),而传递ID需要每次都实际访问ID,然后使用它来查找对象。

by-id方法的另一个问题是,您现在依赖于您的Service来查找对象。您还依赖于在服务中存储id->Object状态,这通常应该避免。然而,这与你的问题是不同的。

那么回到问题:

下面是一个JSFiddle,用于测试和计时这两个场景(您需要打开控制台才能查看计时):http://jsfiddle.net/e10ha2ey/1/

该测试呈现了1500个项目,并具有可用于切换项目绑定方式的按钮。它立即启动一个计时器,并在$digest循环10次后结束。

我简化了by-id端,这样就不用使用服务来查找对象,而是简单地从存储在其$parent上的数组中抓取对象(这是不安全的,不应该在生产代码中完成-假设关于$parent的事情是一个坏主意)。这种方式实际上应该比Service函数更快,因为它避免了额外的函数调用,而只是跳过Object,并获取索引id处的数组项。

尽管如此,引用传递还是更快。对我来说,在这个特定的测试中,它往往会快10%左右。

最重要的是,引用传递代码明显更清晰了!我认为在这种特殊情况下,这应该是更重要的考虑因素。

您应该能够轻松地比较两者的性能。

常识告诉我们,传递资源ID的副本,然后使用该ID获取资源应该会慢一点——如果没有别的,它有两个指令,一个基本对象和一个函数,而不仅仅是传递对象引用


传递字符串与对象隔离作用域的速度有多快?

如果代码是好的,它永远不应该更快。这是一个按引用传递与按值传递的问题(在这种情况下,加做更多),按引用传递总是更快。

最新更新