libxml-ruby
gem kullanarak 500 MB XML dosyasını ayrıştıran bir kod parçam var. Ne bana şaşırtıcı olan, bu kod çalışır sezgilere görünüyor GC özürlü ile yavaş. Sebebi ne olabilir? Çok fazla bellek kullanıyorum ve sistem değişmiyor.Bu XML'in Ruby kodunu ayrıştırması neden GC devre dışıyken daha yavaş çalışıyor?
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
Neden çöp toplayıcı devre dışı bırakın:
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
İşte aldığım sonuçlar nelerdir? Ruby Performance Optimization kitabında okudum, Ruby'nin yavaş olduğunu, çünkü programcıların bellek tüketimini düşünmediklerini, bu da çöp toplayıcısının çok fazla yürütme süresi kullanmasını sağlıyor. Böylelikle, sistemin kapatılmaması koşuluyla, GC'nin kapatılması anında bir şeyleri hızlandıracaktır (elbette bellek kullanım maliyetine bağlı olarak).
benim XML ayrıştırma modülü geliştirilebilir görmek istedim, bu yüzden bu soruna götürdü GC, devre dışı bırakarak onunla denemeye başladı. GC devre dışıyken önemli bir hızlanma bekledim, bunun yerine tam tersini aldım. Farkların çok büyük olmadığını biliyorum, ama yine de bu benim için garip.libxml-ruby
gem, kaputun altında yerel bir C LibXML
uygulaması kullanıyor - nedeni bu olabilir mi?
elle bazı Microsoft belgelerine indirilen books.xml
numuneyi multiplicated edilir kullanılan dosya:
<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>
Benim kurulumu: OS X Yosemite, Intel Core i5 2.6 GHz, RAM 16GB.
Önerileriniz için teşekkür ederiz. İşletim sistemini unutuyorsunuz
@engineersmnky, nasıl daha hızlı yapılacağını sorarsa, kod incelemesine değil, buraya aittir. Tüm bunlarla ilgili yardım istiyorsa, oraya gitmeli. – Riker
@engineersmnky "Nedeni ne olabilir?Çok fazla bellek kullanıyorum ve sistem değişmiyor. " – Riker
@engineersmnky" Aşağıdaki kodun herhangi bir veya tüm yönleri hakkında geri bildirim istiyorum mu? " Geri Bildirim Ver Daha fazla bilgi –