我知道使用template.find()
或template.$
来搜索Meteor中的DOM比搜索所有与document.querySelector()
或jQuery的DOM更快。但我不知道有多快。 我想它会直接与应用程序的DOM节点数量有关,但我不知道是否是这种情况,或者如果Meteor中有任何其他优化/降级使得这种假设不成比例。 有没有人知道关于此性能测试/结果?
回答
template
不等于document
。 A document
可以包含许多template
。 template.find
abstracts $
,但template.find
不添加任何功能。所以template.$
和template.find
或多或少会有同样的表现。 $
是jQuery
的常见别名,当您将单个字符串传递给jQuery
函数时,它会经过几次抽象,并且可能是土地上的document.querySelector
。这就是为什么document.querySelector
is a lot faster than jQuery
(jsperf现在下降,所以我不能告诉你多快)。 jQuery
太慢了,在大多数情况下,它可能会在document.querySelector
和template.$
之间关闭。
通过获取包装目标的节点并使用native-DOM函数,您将获得最佳性能。如果您的模板中有一个包装元素,则可以使用template.firstNode
属性。否则,你可以做些什么:template.firstNode.parentElement
。然后我使用getElementsByClassName
或getElementById
。他们比querySelector
更快,因为使用querySelector
查询必须先被解析。至少大部分时间取决于包装节点中的节点数量以及树中搜索元素的距离。
我不能说我注意到我的用户有任何真正的性能提升,但我会说template.find()似乎让我在编码方面有了性能提升。
例如
var someID = $('#some-id');
不会是可控的,直到我添加一个数组插槽,像这样:
var someID = $('#some-id')[0];
凡为
var someID = template.find('#some-id')
只返回HTML元素,意思是我不必每次都像数组一样对待它。
关于该数组的事情..流星只是执行'jQuery'并返回'[0]'。 [源代码](https://github.com/meteor/meteor/blob/master/packages/blaze/template.js#L311)。我知道它有点更好,但它需要jQuery的整个链接。正如我所看到的那样,它是唯一的好处。 – Kriegslustig
我也有这个问题。然后仔细查看文档(Meteor和jQuery),我发现这正是使用模板的好处之一。$(selector)特别是当使用类作为选择器时:将搜索的范围缩小到模板我得到JUST元素I希望它工作正常,我可以应用jQuery方法与使用jQuery完全相同。当我使用jQuery时,有时我会得到更多其他元素与同一个类,并且我遇到同样的问题。 –
感谢Paulo,是的,确切的问题是我无法将jQuery方法应用到它。很高兴知道。 – thatgibbyguy
- 1. MYSQL IN vs <> performance
- 2. document.querySelector vs Polymer.dom(this。$)。querySelector
- 3. performance stringbuf vs string
- 4. TagSoup vs JSoup :: Performance?
- 5. git vs mercurial performance
- 6. VS 2010 Performance Explorer
- 7. DB2 Performance CASE vs COALESCE
- 8. String.format()vs string concatenation performance
- 9. eclipse performance arm vs intel
- 10. php> performance> session vs globals vs db>?
- 11. $(this)vs this in jQuery
- 12. Droppable vs Clickable in Jquery
- 13. C#vs C++ for loop performance measurment
- 14. lapply vs for loop - Performance R
- 15. $ injector.instantiate VS $ injector.get VS $ injector.invoke in angularjs
- 16. ECB vs global vs cscope .. in emacs
- 17. Mysql COUNT VS num rows performance
- 18. neo4j cypher single vs multiple labels performance
- 19. Javascript performance for property access:undefined vs false
- 20. OpenGL ES 2.0:glUseProgram vs glUniform performance
- 21. meteor build --server vs ROOT_URL
- 22. Datagrid in vs 2010
- 23. Angular 2 @View with template vs @Component with template
- 24. Angular 2 Reactive Forms vs Template Forms
- 25. 用户vs sudo vs sudo_user in ansible playbooks
- 26. ion-list vs ion-scroll vs virtualScroll in ionic 3
- 27. AS3> performance> if(myBooleanField)* VS * if(myObjectField!= null)* VS * if(myIntField!= 0)
- 28. concat in FSharp.Core.String vs Concat in System.String
- 29. inline asm in C++ in vs __asm
- 30. python in applescript:subprocess.call vs os.system in automator
你说得对。我使用jperf来查看这些DOM遍历差异有多大。从你说的我想象通过使用模板。$查询首先完成,然后结果被传递给一个jQuery对象,而不是相反。此外,你建议使用本地getElementByClassName(我不使用元素中的ID),而不是在文档上,但在template.firstNode上。但是,这不会搜索我认为的兄弟姐妹,所以我必须将我的模板元素包含在div中,例如? –
'模板。$'通过抽象层执行'$'。它隐藏了[深入内部](https://github.com/meteor/meteor/blob/master/packages/blaze/dombackend.js#L177)。所以它很慢。搜索我发现了一个替代缠绕'div'的艰难。看看我的[最新版本](https://stackoverflow.com/posts/31082153/revisions)。另外,要回答你的问题:正确。 – Kriegslustig
@PauloJaneiro我发现blaze使用'_domrange.parentNode'作为'$'-selector的上下文。这意味着'template。$'的范围等同于'template.firstNode.parentElement'。 [所以我更新了我的答案](https://stackoverflow.com/posts/31082153/revisions) – Kriegslustig