Ho un pezzo di codice che analizza il file XML da 500 MB utilizzando la gemma libxml-ruby
. Ciò che è sorprendente per me, questo codice corre più lento con GC disabilitato, che sembra contro-intuitivo. Quale potrebbe essere la ragione? Ho a disposizione molta memoria e il sistema non si sta scambiando.Perché questo codice XML di analisi Ruby viene eseguito più lentamente con GC disabilitato?
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
Ecco i risultati che ho ottenuto:
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
Perché disattivare il garbage collector? Ho letto nel libro Ruby Performance Optimization che Ruby è lento soprattutto perché i programmatori non pensano al consumo di memoria, il che rende il garbage collector utilizzare un sacco di tempo di esecuzione. Quindi, spegnere il GC dovrebbe velocizzare istantaneamente le cose (a costo dell'utilizzo della memoria, ovviamente), a condizione che il sistema non stia cambiando.
Volevo vedere se il mio modulo di analisi XML può essere migliorato, così ho iniziato a sperimentarlo disabilitando il GC, che mi ha portato a questo problema. Mi aspettavo una significativa accelerazione con GC disabilitato, ma invece ho ottenuto il contrario. So che le differenze non sono enormi, ma comunque è strano per me.
libxml-ruby
gem usa un'implementazione nativa C LibXML
sotto il cofano - può essere la ragione?
Il file che ho usato è moltiplicata manualmente books.xml
campione scaricato da un po 'di documentazione di Microsoft:
<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>
La mia configurazione: OS X Yosemite, processore Intel Core i5 2.6 GHz, 16 GB di RAM.
Grazie per eventuali suggerimenti.
@engineersmnky se sta chiedendo come rendere più veloce, appartiene qui, non sulla revisione del codice. Se vuole aiuto con tutto questo, dovrebbe andare lì. – Riker
@engineersmnky "Quale potrebbe essere la ragione?Ho un sacco di memoria disponibile e il sistema non si sta scambiando. " – Riker
@engineersmnky Vedi il bit più sotto, che dice" Voglio un feedback su qualsiasi o tutti gli aspetti del codice? ". OP non vuole quel tipo di –