微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个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停用减速.在你的基准测试中,你的盒子的负载平均值和交换使用量是多少.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。