we are already down that path
jib:~ > ruby -r yaml -e 'y %w(abc hi there)'
---
- abc
- hi
- there
eg. there is not %w equivalent of ["abc", "hi there"] and this has not been a
problem.
This was mentioned elsewhere on this thread, I believe:
%w(abc hi\ there)
==>["abc", "hi there"]
and you could never need
hash['hi there'.intern]
since you could not type
hash[:hi there]
hash[:"hi there"]
I've used symbols with embedded spaces before, in hashes. It seems odd to use them in method names, but as someone else pointed out, it does work...
cheers,
Mark
···
On Aug 6, 2004, at 8:41 AM, Ara.T.Howard wrote:
i've always assumed this to be true too, but:
jib:~ > ruby a.rb 8192
···
On Sat, 7 Aug 2004, David A. Black wrote:
Maybe, but people are always talking about using symbols to speed up hashes,
etc.... And symbols *can* act that way, so not accomodating it in some way
would be somewhat arbitrary.
---
-
Symbol:
max: "0.0039439201354981"
avg: "0.0000033703981899"
min: "0.0000019073486328"
-
String:
max: "0.0023880004882812"
avg: "0.0000032874231692"
min: "0.0000019073486328"
jib:~ > cat a.rb
require 'tempfile'
require 'tmpdir'
require 'fileutils'
require 'yaml'
class HashProfiler
PATHS = {
String => File.join(Dir.tmpdir, 'string'),
Symbol => File.join(Dir.tmpdir, 'symbol'),
}
at_exit{ PATHS.map{|t,p| FileUtils.rm_f p} }
class << self
def stats
list =
PATHS.each do |type,path|
times = IO.readlines(path).map{|line| Float line}
avg = times.inject(0.0){|a,f| a += f} / times.size.to_f
list << Hash[
type.to_s => {
'min' => ('%16.16f' % times.min),
'max' => ('%16.16f' % times.max),
'avg' => ('%16.16f' % avg),
}
]
end
list
end
end
def initialize type, n
@type = type
@n = n
populate
gen_lookups
end
def populate
@h = {}
@n.times do |i|
key = "foobar#{ i }"
@h[(String == @type ? key : key.intern)] = rand
end
@keys = @h.keys
@size = @keys.size
end
def gen_lookups
@lookups =
@n.times{|i| @lookups << @keys[rand(@size)]}
end
def profile
fork do
GC.disable
open(PATHS[@type],'a+') do |f|
@lookups.each do |k|
a = Time.now.to_f
v = @h[k]
b = Time.now.to_f
t = b - a
f.puts t
end
end
exit!
end
Process.wait
end
end
STDOUT.sync = true
n = Integer(ARGV.shift || 2 ** 13)
[String, Symbol].each do |type|
profiler = HashProfiler.new type, n
4.times{ profiler.profile }
end
y HashProfiler.stats
this suprises me - they look to be about the same. perhaps my code has a bug.
regards.
-a
--
EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen
===============================================================================