Context:我有一个可以处理和显示巨大日志文件的网络应用程序。它们的长度通常只有 10 万行左右,但也可能长达 400 万行或更多。为了能够滚动浏览该日志文件(用户启动的和通过 JavaScript 的)并以良好的性能过滤行,我在数据到达后立即为每一行创建一个 DOM 元素(通过 ajax 以 JSON 形式)。我发现这比在后端构建 HTML 的性能更好。然后,我将元素保存在数组中,并且只显示可见的行。
对于最多 100k 行,这只需要大约几秒钟,但对于 500k 行(不包括下载),更多时间最多需要一分钟。我想进一步提高性能,所以我尝试使用 HTML5 Web Workers。现在的问题是我无法在 Web Worker 中创建元素,甚至无法在 DOM 之外创建元素。所以我最终只在 Web Workers 中进行 json 到 HTML 的转换,并将结果发送到主线程。在那里它被创建并存储在一个数组中。不幸的是,这降低了性能,现在至少需要 30 秒的时间。
问题:那么有什么我不知道的方法可以在 DOM 树之外的 Web Worker 中创建 DOM 元素吗?如果没有,为什么不呢?在我看来,这不会产生并发问题,因为创建元素可以并行发生而不会出现问题。
好吧,我根据 @Bergi 提供的信息做了一些更多的研究,并在 W3C 邮件列表上找到了以下讨论:
http://w3-org.9356.n7.nabble.com/Limited-DOM-in-Web-Workers-td44284.html
摘录回答了为什么无法访问 Web Worker 中的 XML 解析器或 DOM 解析器:
您假设 DOM 实现代码均不使用任何排序
的非 DOM 对象,或者如果确实如此,那么这些对象就完全
线程安全。但事实并非如此,至少在 Gecko 中是这样。
本例中的问题不是所触及的同一个 DOM 对象
多线程。问题是两个 DOM 对象位于不同的线程上
两者都触及某个全球第三个物体。
例如,XML 解析器必须做一些 Gecko 中可以做的事情
只能在主线程上完成(DTD 加载,临时的;有一个
其他一些我以前见过但一时想不起来)。
然而,还提到了一种解决方法,即使用解析器的第三方实现,其中jsdom就是一个例子。有了这个,您甚至可以访问您自己的单独文档。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)