[ruby-it] Socket, irb e prestazioni

Paolo Bosetti paolo.bosetti a mac.com
Ven 13 Apr 2007 21:03:48 CEST


Permesso e ciao a tutti.
Come sempre succede nei forum, il mio primo accesso qui coincide con una
domanda.

Sto sviluppando un insieme di classi (ovviamente in ruby) che hanno lo
scopo di gestire la registrazione dell'output di un dispositivo di
misura.
Il dispositivo in questione è dotato di una interfaccia ethernet con un
protocollo binario proprietario ma aperto. La classe che ho scritto si
occupa di aprire una connessione via socket (TCPSocket) con il
dispositivo e fornisce una serie di metodi per accedere alle
funzionalità del dispositivo di misura, tra cui il metodo più importante
che - ovviamente - legge i valori misurati.
Il mio scopo è interrogare il dispositivo con una frequenza che sia
almeno pari a 100 Hz.
Se invoco il metodo di lettura valori all'interno di un ciclo while in
irb ottengo frequenze superiori ai 700 Hz, su una comune rete 100Mbit,
con un paio di switch di mezzo e su due sottoreti differenti. Vaore
ottimale e più che sufficiente. Si noti che ogni chiamata trasferisce
meno di 1000 byte.
Se invece invoco il metodo all'interno di uno script stand-alone, la
frequenza cala brutalmente, e non è mai superiore a 60 Hz.
Ho notato che se prima di chiamare il metodo inserisco uno sleep 10 la
situazione migliora leggermente (tipicamente passo da 20 a 60 Hz) e
questo immagino sia dovuto ai meccanismi di precompilazione e caching
dell'interprete.
Resta comunque una impressionante differenza tra irb e l'interprete
ruby: qualcun o di voi sa a cosa potrebbe essere dovuta?

Ad onore di ruby, devo dire che la stessa classe l'ho scritta anche in
C++ e Objective-C, ottenendo prestazioni assolutamente paragonabili
(circa 700 Hz). Ovviamente la classe in Ruby l'ho scritta in metà righe
e un quarto del tempo!

Se qualcuno ha esperienza su problemi analoghi e/o ha interesse ad
approfondire l'argomento...
Grazie!

-- 
Posted via http://www.ruby-forum.com/.


Maggiori informazioni sulla lista Ml