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.
谢谢你的任何建议.
解决方法
事实上,我相信通过禁用GC会严重影响应用程序的行为,使您的程序可能需要不断从内核请求更多RAM.这可能会在内核中产生某种形式的开销,因为它会为您分配交换或内存.
您的源数据是一个500 MB的xml文件,您正逐节点地读入MRI程序的内存占用.在完成处理时,您的MRI过程可能会消耗几GB的数据;并且在每次迭代后都不会丢弃主读取块中的任何值 – 它们只是在内存中挂起,并且只有在应用程序退出并将内存传回操作系统时才会最终清除.
GC管理这个;它旨在防止您的应用程序从内核请求额外的内存,除非它绝对需要它,并允许您的应用程序在合理的内存中“足够好”地运行.
所以我很遗憾你看到GC停用减速.在你的基准测试中,你的盒子的负载平均值和交换使用量是多少.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。