为什么这个XML解析Ruby代码在禁用GC时运行得更慢?
我有一段代码使用libxml-
ruby gem解析500 MB
XML文件.让我感到惊讶的是,这个代码在禁用GC时运行速度较慢,这似乎是违反直觉的.可能是什么原因?我有足够的内存,系统没有交换.
require 'xml' #GC.disable @reader = XML::Reader.file('books.xml',:options => XML::Parser::Options::NOBLANKS) @reader.read @reader.read while @reader.name == 'book' book_id = @reader.get_attribute('id') @reader.read until @reader.name == 'book' && @reader.node_type == XML::Reader::TYPE_END_ELEMENT case @reader.name when 'author' author = @reader.read_string when 'title' title = @reader.read_string when 'genre' genre = @reader.read_string when 'price' price = @reader.read_string when 'publish_date' publish_date = @reader.read_string when 'description' description = @reader.read_string end @reader.next end @reader.read end @reader.close 以下是我得到的结果: ruby gc on gc off 2.2.0 16.93s 18.81s 2.1.5 16.22s 18.58s 2.0.0 17.63s 17.99s 为什么禁用垃圾收集器?我在Ruby Performance Optimization书中读到Ruby很慢,主要是因为程序员不考虑内存消耗,这使得垃圾收集器使用了大量的执行时间.因此,只要系统没有交换,关闭GC就会立即加快速度(以内存使用为代价). 我想看看我的XML解析模块是否可以改进,所以我开始通过禁用GC来试验它,这让我遇到了这个问题.我预计在禁用GC的情况下会显着提高速度,但我却反其道而行之.我知道差异并不大,但这对我来说仍然很奇怪. libxml-ruby gem使用本机C LibXML实现 – 这可能是原因吗? 我使用的文件是从一些Microsoft文档下载的手动多重books.xml示例: <catalog> <book id="bk101"> <author>John Doe</author> <title>XML for dummies</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>Some description</description> </book> .... </catalog> 我的设置:OS X Yosemite,Intel Core i5 2.6 GHz,16GB RAM. 谢谢你的任何建议. 解决方法
您忘记了操作系统 – 您已经在MRI过程中禁用了GC但是您无法控制linux / unix内核以及它如何为您的MRI应用程序分配内存.
事实上,我相信通过禁用GC会严重影响应用程序的行为,使您的程序可能需要不断从内核请求更多RAM.这可能会在内核中产生某种形式的开销,因为它会为您分配交换或内存. 您的源数据是一个500 MB的xml文件,您正逐节点地读入MRI程序的内存占用.在完成处理时,您的MRI过程可能会消耗几GB的数据;并且在每次迭代后都不会丢弃主读取块中的任何值 – 它们只是在内存中挂起,并且只有在应用程序退出并将内存传回操作系统时才会最终清除. GC管理这个;它旨在防止您的应用程序从内核请求额外的内存,除非它绝对需要它,并允许您的应用程序在合理的内存中“足够好”地运行. 所以我很遗憾你看到GC停用减速.在你的基准测试中,你的盒子的负载平均值和交换使用量是多少. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |