【问题标题】:Need performance improvement需要性能改进
【发布时间】:2012-12-17 15:55:21
【问题描述】:

我正在尝试 CasperJS。我正在尝试创建一个网络 scraper 。我需要抓取网站的所有页面并在 5 秒内(每个页面)获取数据。 为此,我将不得不浏览所有类似的页面。转到适当的内容 div 并从那里获取数据。 因此,如果该网站有 1000 个页面。我需要尽快完成整个操作。我无法控制 N/w 延迟、页面大小等参数。我能控制的只是解析机制。所以我希望它尽可能快。如果有很小的改进,那么它将推断为 URL 的数量

我正在尝试解析子元素并创建 CSS 路径。 我需要确保解析不会花费很长时间。 我听说标准的 java 脚本在性能方面比 JQuery 更有效。 因此,我需要输入。

以下 JQuery 代码的标准 JS 等效项是什么,在解析方面性能高效。

function() {    
    var TAG_CSS_PATH = 'div#buttons ul li.tab';
    var selectOptions =  $(TAG_CSS_PATH);
    var results = [],i=0;
    selectOptions.each(function(index,value) {
        index=index+1;
        results.push(TAG_CSS_PATH+':nth-of-type('+index+')');
    });
    return results
}

如果有人可以提供任何其他建议,我将不胜感激。

【问题讨论】:

  • 你为什么不尝试转换它,然后我们可以提供帮助。
  • 这是一个幼稚的问题。但我也需要有关性能的输入。
  • 没有上下文,性能无关紧要。就性能而言,jQuery 也相当不错。只有在尝试某些东西时才应该担心性能,但它实际上太慢了。
  • 实际上,@kennypu:在性能方面,jQuery 与原生 JS 相比很糟糕。
  • 不知道为什么,但已知 querySelectorAll(TAG_CSS_PATH) 比任何其他 Jquery 选择器执行得更快。我确实搜索了@Cerbrus 提供的答案。

标签: javascript jquery performance


【解决方案1】:

jQuery 部分是 $selector 和 $each。这些可以替换如下。

function() {    
    var TAG_CSS_PATH = '#buttons ul li.tab',
        selectOptions =  document.querySelectorAll(TAG_CSS_PATH),
        results = [];

    for( var i = 1, ln = selectOptions.length + 1; i < ln; i++ ) {
        results.push(TAG_CSS_PATH+':nth-of-type('+ i +')');
    }

    return results;
}

由于您要存储选择器,因此对我来说似乎仍然非常低效(使用 nth-of-type 是昂贵的选择器)。选择器从右到左读取。

CSS/选择器优化
笔记, div#buttons 似乎是多余的。如果您正确使用 CSS,您将只有 一个 元素与 id='buttons' 完全匹配。因此,通过正确使用 ID,您应该能够删除选择器中的 div
此外,如果您所有的.tabs 都是li,那么您也可以删除li。如果您所有的li.tabs 都在ul 内,您也可以删除ul

【讨论】:

  • 但是我稍后在代码中需要选择器数组。有没有比 nth-of-type 更快的方法。或者可能是其他方法来做到这一点。我查看了 XPaths。但我不知道它会比 CSS Paths 快。
  • 您能否详细说明您计划以后如何使用它们?因为不同的用法可能会导致不同的最优解。
  • 当然。我正在尝试 CasperJS。我正在尝试为特定站点创建 webscrapper。我需要在 5 秒内删除网站的所有页面并获取数据。为此,我将不得不浏览所有类似的页面。转到适当的内容 div 并从那里获取数据。因此,如果该站点有 1000 个页面。我需要尽快完成整个操作。我无法控制 N/w 延迟、页面大小等参数。我所能控制的就是解析机制。所以我希望它尽可能快。如果有很小的改进,那么它将推断为 URL 的数量。
  • 我曾经在 HtmlUnit 和 Selenium 上工作以进行测试。它是基于 Java 的。但我最近不得不搬到 CasperJS。与基于 JavaScript 的两者相比,它更快。
  • 我明白了。我的错,但是,我更具体地针对你将使用你的结果的地方。你能把它加到你的帖子里吗?
【解决方案2】:

应该这样做:

function() {    
    var TAG_CSS_PATH = 'div#buttons ul li.tab',
        selectOptions = document.querySelectorAll(TAG_CSS_PATH),
        results = [],
        l = selectOptions.length + 1;
    for(var i = 1; i < l; i++){
        results.push(TAG_CSS_PATH+':nth-of-type('+i+')');
    }
    return results;
}

【讨论】:

  • 对于微优化,将 selectOptions.length 放在 for 循环之外
  • 你在'index+1'上不见了
  • @EricG:此代码必须是正确答案然后:P 现在这只是一个偏好问题:l = Xfor 内部或外部。
  • 同意 ;) 通常我会在声明中做变量,只在循环中需要一次(除非它变得很长且不可读,但长度通常只是唯一的额外变量)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多