On Sun, 14 Aug 2005, Joe Van Dyk wrote: > Ah, ok. In my application, there's a bunch more than 3 possible keys and > they are of differing length. I am in control of the format of the incoming > strings though, and so could modify their format to make them easier/faster > to parse. Any ideas on what would be a more efficient format for > transporting the data? binary. > (for reference, the original string format was "id: 3, x_position: 39, > y_position: 209, z_position: 39" and in my real application, there's about > twenty different attributes that are in the string.) > > Perhaps it would be more efficient to not convert the string into a hash? > > All I really need to be able to do is access/display a player's data via > some mechanism, and a player's data should be updated once a second, and > there's up to 400 players. The above was the best way I could come up with > transporting and accessing the data, but perhaps there's a better way of > doing it. something similar in spirit to this would support many players: harp:~ > cat a.rb class PlayerData ATTRIBUTES = %w( id x_position y_position z_position foobar ).each{|a| attr a} FORMAT = 'ifffi' class << self def create(*a); new(a.flatten.pack(FORMAT)); end end attr :buffer attr :to_s def update buffer ATTRIBUTES.zip((@buffer = buffer).unpack(FORMAT)) do |a,v| instance_variable_set "@#{ a }", v end @to_s = ATTRIBUTES.inject(''){|s,a| s << "#{ a } : #{ send a }, " }.chop.chop end alias initialize update end id, x_position, y_position, z_position, foobar = 400, 1.0, 2.0, 3.0, 0b101010 pd = PlayerData::create id, x_position, y_position, z_position, foobar p pd p pd.id p pd.x_position p pd.foobar puts pd begin require 'timeout' n = 0 Timeout::timeout(10) do loop do PlayerData::create id, x_position, y_position, z_position, foobar n += 1 end end rescue Timeout::Error puts "creations per second : #{ n / 10 }" end harp:~ > ruby a.rb #<PlayerData:0xb75cdf04 @x_position=1.0, @foobar=42, @id=400, @buffer="\220\001\000\000\000\000\200?\000\000\000@\000\000@@*\000\000\000", @z_position=3.0, @to_s="id : 400, x_position : 1.0, y_position : 2.0, z_position : 3.0, foobar : 42", @y_position=2.0> 400 1.0 42 id : 400, x_position : 1.0, y_position : 2.0, z_position : 3.0, foobar : 42 creations per second : 14045 not to mention the message (player data strings) will be an order of magintitude smaller to pass around - like over a network. cheers. -a -- =============================================================================== | email :: ara [dot] t [dot] howard [at] noaa [dot] gov | phone :: 303.497.6469 | Your life dwells amoung the causes of death | Like a lamp standing in a strong breeze. --Nagarjuna ===============================================================================