Sha256: a98a59386af9437bc603be43dd6af1905d3ed37e4b1d32e1dd6214ae37175f62

Contents?: true

Size: 1.6 KB

Versions: 8

Compression:

Stored size: 1.6 KB

Contents

$:.unshift File.dirname(__FILE__) + '/../../lib'
require 'mq'

# check MAX numbers for prime-ness
MAX = 1000

# logging
def log *args
  p args
end

# spawn workers
workers = ARGV[0] ? (Integer(ARGV[0]) rescue 1) : 1
EM.fork(workers) do

  log MQ.id, :started

  class Fixnum
    def prime?
      ('1' * self) !~ /^1?$|^(11+?)\1+$/
    end
  end

  class PrimeChecker
    def is_prime? number
      log "prime checker #{MQ.id}", :prime?, number
      number.prime?
    end
  end

  MQ.rpc('prime checker', PrimeChecker.new)

end

# use workers to check which numbers are prime
EM.run{
  
  prime_checker = MQ.rpc('prime checker')

  (10_000...(10_000+MAX)).each do |num|
    log :checking, num

    prime_checker.is_prime?(num) { |is_prime|
      log :prime?, num, is_prime
      (@primes||=[]) << num if is_prime
      
      if (@responses = (@responses || 0) + 1) == MAX
        log :primes=, @primes
        EM.stop_event_loop
      end
    }

  end
  
}

__END__

$ uname -a
Linux gc 2.6.24-ARCH #1 SMP PREEMPT Sun Mar 30 10:50:22 CEST 2008 x86_64 Intel(R) Xeon(R) CPU X3220 @ 2.40GHz GenuineIntel GNU/Linux

$ cat /proc/cpuinfo | grep processor | wc -l
4

$ time ruby primes-simple.rb 

real  0m16.055s
user  0m16.052s
sys 0m0.000s

$ time ruby primes.rb 1 >/dev/null

real  0m18.278s
user  0m0.993s
sys 0m0.027s

$ time ruby primes.rb 2 >/dev/null

real  0m17.316s
user  0m0.967s
sys 0m0.053s

$ time ruby primes.rb 4 >/dev/null

real  0m8.229s
user  0m1.010s
sys 0m0.030s

$ time ruby primes.rb 8 >/dev/null

real  0m5.893s
user  0m1.023s
sys 0m0.050s

$ time ruby primes.rb 16 >/dev/null

real  0m5.601s
user  0m0.990s
sys 0m0.043s

Version data entries

8 entries across 8 versions & 2 rubygems

Version Path
tmm1-amqp-0.5.3 examples/mq/primes.rb
tmm1-amqp-0.5.5 examples/mq/primes.rb
tmm1-amqp-0.5.9 examples/mq/primes.rb
tmm1-amqp-0.6.0 examples/mq/primes.rb
amqp-0.6.0 examples/mq/primes.rb
amqp-0.5.9 examples/mq/primes.rb
amqp-0.5.5 examples/mq/primes.rb
amqp-0.5.3 examples/mq/primes.rb