On 7/1/05, Daniel Brockman <daniel / brockman.se> wrote:
> Joe Van Dyk <joevandyk / gmail.com> writes:

(original attempt.. was too slow)

> 
> >     attributes = message.split(",")
> >     attributes.each do |attribute|
> >       key, value = attribute.scan(/(\w+): (.+)/)[0]
> >       result_hash[key.to_sym] = value.strip
> >     end
> 
> How about this?
> 
>    message.scan /(\w+)\s*:\s*([^, ]*)/ do |k, v|
>      result_hash[k.to_sym] = v end
> 
> > Also, this will get ran potentially thousands of times per second,
> > so executation speed is of some concern.
> 
> I don't know if the above is the best you can do, but I do believe it
> is a bit faster than your original version.

Bringing up an old thread.... I have the following code.

  # Converts an array like
  # [[0, "x_position: 20, y_position: 40, z_position: 30"],
  #  [1, "x_position: 20, y_position: 40, z_position: 30"]
  # ]
  #  
  #  into a hash like
  #  { 0 => { :x_position => "20", :y_position => "40", :z_position => "30" },
  #    1 => { :x_position => "20", :y_position => "40", :z_position => "30" }
  #  }
  def self.convert_message_to_hash players_array
    raise "Can't do anything with empty message!" if original_message.nil?
    result_hash = {}
    original_message.each do |id, message|
      message.scan(/(\w+)\s*:\s*([^, ]*)/) do |k, v|
        result_hash[id][k.to_sym] = v 
      end
    end
    result_hash
  end
end

That code in my application leads to the following profiling:
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 37.84   261.23    261.23     5569    46.91    69.61  String#scan
  8.12   317.28     56.05   201791     0.28     0.28  Hash#[]
  6.42   409.72     44.31   150783     0.29     0.29  Hash#[]=
  6.36   453.61     43.89   144782     0.30     0.30  String#to_sym

I believe this is probably the critical part of my code.

Ideas on how to improve this would be appreciated!