Le 23 janvier 2009 à 16:55, Bart B. a écrit :
On Jan 23, 4:33 pm, “F. Senault” [email protected] wrote:
store and retrieve again.
On a box of mine (a 2.6GHz dual core AMD 64 CPU), it takes 10 seconds to
make 10 arrays of 1.000.000 random numbers, and memory consumption was
about 500M. As for the access times :
ruby 1.9.1p0 (2009-01-20 revision 21700) [amd64-freebsd7]
Seeding in 8.921912
user system total real
Pseudo seqs 93.429688 0.218750 93.648438 ( 93.614218)
Real rand 108.500000 0.000000 108.500000 (108.456800)
The first is accessing the 10 arrays of numbers to pick 1.000.000
numbers between 1 and 26, the second uses the old rand method with no
reseeding whatsoever.
On the other hand, I don’t know the exact kind of use you have, but…
you could also generate sequences of a few thousands in arrays and
simply cycle through them (i.e. reuse the numbers a few times). If
you’re concerned about random distribution, this wouldn’t be a problem ?
(Uglyish) code :
#! /usr/local/bin/ruby
require “benchmark”
t = Time.new
NUM_SEQ = 10
SEEDS = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
NUM_NUMS = 1_000_000
$numbers = []
NUM_SEQ.times do |i|
srand(SEEDS[i])
a = Array.new(NUM_NUMS) { rand }
$numbers << a
end
$curr_seq = 0
$curr_index = 0
$curr_nums = $numbers[0]
$indexes = Array.new(NUM_SEQ, 0)
puts “Seeding in #{”%2.6f" % (Time.new - t)}"
module Kernel
alias old_rand rand
def swap_seq(seq)
$indexes[$curr_seq] = $curr_index
$curr_seq = seq
$curr_index = $indexes[seq]
$curr_nums = $numbers[seq]
end
def reset_seq(seq)
$indexes[seq] = 0
$curr_index = 0 if seq == $curr_seq
end
def rand(x = nil)
r = $curr_nums[$curr_index]
$curr_index += 1
r = (r * x).to_i if x
r
end
end
acc = 1_000_000
n = 100
Benchmark.bm 20 do |x|
x.report “Pseudo seqs” do
n.times do
ns = 0
s = “”
nq = 0
acc.times do |z|
s = (rand(26) + 65).chr
nq += 1
if nq == 1000
ns = (ns + 1) % NUM_SEQ
swap_seq(ns)
nq = 0
end
end
NUM_SEQ.times { |q| reset_seq(q) }
end
end
x.report “Real rand” do
n.times do
s = “”
acc.times do |z|
s = (old_rand(26) + 65).chr
end
GC.start
end
end
end
Fred