我知道有幾十種方法可以選擇Nokogiri中的第一個子元素,但哪個是最便宜的? 我無法繞過使用節點#的孩子,這聽起來非常昂貴。假設有10000個子節點,並且我不想觸摸9999個其他節點...在Nokogiri中選擇一個子節點的絕對最便宜的方法是什麼?
回答
節點#子是獲取第一個子元素的最快方法。然而,如果你正在尋找的節點不是第一個(例如第99個),那麼沒有比選擇該節點更快的方式來調用#children和索引。
如果您只需要第一個孩子,那麼爲所有孩子構建NodeSet是昂貴的。
一個限制因素是libxml2(基礎Nokogiri的XML庫)將節點的子節點存儲爲鏈接列表。所以你需要遍歷列表(O(n))來選擇所需的子節點。
編寫一個方法來簡單地返回第n個孩子,而不實例化所有其他孩子的NodeSet或Ruby對象是可行的。我的建議是打開功能請求,在http://github.com/tenderlove/nokogiri/issues或發送電子郵件到nokogiri郵件列表。
您可以自己嘗試並基準結果。
我創建了一個快速基準:http://gist.github.com/283825
$ ruby test.rb
Rehearsal ---------------------------------------------------
xpath/first() 3.290000 0.030000 3.320000 ( 3.321197)
xpath.first 3.360000 0.010000 3.370000 ( 3.381171)
at 4.540000 0.020000 4.560000 ( 4.564249)
at_xpath 3.420000 0.010000 3.430000 ( 3.430933)
children.second 0.220000 0.010000 0.230000 ( 0.233090)
----------------------------------------- total: 14.910000sec
user system total real
xpath/first() 3.280000 0.000000 3.280000 ( 3.288647)
xpath.first 3.350000 0.020000 3.370000 ( 3.374778)
at 4.530000 0.040000 4.570000 ( 4.580512)
at_xpath 3.410000 0.010000 3.420000 ( 3.421551)
children.second 0.220000 0.010000 0.230000 ( 0.226846)
從我的測試中,children
似乎是最快的方法。
您所使用的四種第一種方法使用xpath,這非常緩慢。 正如問題中提到的那樣,子方法分析整個父節點,這也是不可接受的。 嘗試使用100倍的節點和1/100的許多測試。 – Steinbitglis 2010-01-22 16:46:39
感謝您向我展示基準庫......我認爲它可能在未來有用:-) – Steinbitglis 2010-01-22 16:48:08
,無論是使用XPath也導致解析整個母公司的一個方法是使用這兩個節點#子(),節點#NEXT_SIBLING()和節點#元素?()
這樣的事情...
def first(node)
element = node.child
while element
if element.element?
return element
else
element = element.next
end
end
nil
end
- 1. 在MySQL中插入唯一行的最便宜的方法是什麼?
- 2. opencv在盒子中選擇一個對象的最佳方式是什麼?
- 3. 生成單個對象的最便宜的方法Enumerable?
- 4. 最便宜的EDI通信方法?
- 5. 在JavaFX中移動絕對定位節點的最佳方式是什麼?
- 6. 部署ASP.Net MVC應用程序的最便宜的方法是什麼?
- 7. 的XPath選擇最上面的節點只是一個無子女的節點
- 8. 檢查javascript中是否存在子節點的最佳方法是什麼?
- 9. 在java中將最後一個節點的TreeSet橫切到第一個節點的最佳方式是什麼?
- 10. 使用Nokogiri選擇節點,然後選擇下一個指定節點
- 11. 在XmlDocument中排序節點的最佳方法是什麼? (.Net)
- 12. 在SQL中生成datetime的最方便的方法是什麼?
- 13. 將n個節點連接到單個節點的最佳方法是什麼?
- 14. 從幾個表中選擇行的最佳方法是什麼?
- 15. 什麼是節點的第一個子節點的精確xpath?
- 16. 如何僅選擇Nokogiri的葉節點?
- 17. 獲取SQLite數據庫中行數(數據)的最便宜方式是什麼?
- 18. Knockout中呈現靜態模板的最便宜方式是什麼?
- 19. 測試View是否被回收的最便宜方式是什麼?
- 20. 最便宜的方法來分類HTTP發佈對象
- 21. Magento最便宜的支付處理系統是什麼?
- 22. 斯卡拉最便宜的類型是什麼?
- 23. 什麼是最便宜的雲非BLOB存儲?
- 24. 什麼是最便宜的方法來知道路徑是指在c + +中的文件夾或文件?
- 25. 在D3中樹中選擇父節點的最簡單方法
- 26. 爲什麼我無法創建一個Nokogiri節點?
- 27. 對絕對值做max()最便宜的方法,但是max()會保存符號嗎?
- 28. 在Mac上安裝/運行SAS的最便宜和最簡單的方法是什麼?
- 29. 什麼是在Mac上製作ASP.NET MVC項目的最簡單和最便宜的方法?
- 30. 從該陣列中選擇一個子集的最「功能」方式是什麼?
它已經完成!謝謝:-) http://github.com/tenderlove/nokogiri/issues#issue/211 – Steinbitglis 2010-01-24 11:44:21