Skip to content

Instantly share code, notes, and snippets.

@chastell
Created October 21, 2010 08:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chastell/638149 to your computer and use it in GitHub Desktop.
Save chastell/638149 to your computer and use it in GitHub Desktop.
require 'benchmark'
require './integer'
require 'prime'
Benchmark.bmbm do |bench|
bench.report 'simple:' do
(2..100_000).each { |i| i.simple_prime? }
end
bench.report 'clever:' do
(2..100_000).each { |i| i.clever_prime? }
end
bench.report 'stdlib:' do
(2..100_000).each { |i| i.prime? }
end
bench.report 'inline:' do
(2..100_000).each { |i| i.inline_clever }
end
end
require 'benchmark'
require './integer'
require 'prime'
Benchmark.bmbm do |bench|
bench.report 'simple:' do
(2..100_000).each { |i| i.simple_prime? }
end
bench.report 'clever:' do
(2..100_000).each { |i| i.clever_prime? }
end
bench.report 'stdlib:' do
(2..100_000).each { |i| i.prime? }
end
end
require 'benchmark'
require './integer'
require 'prime'
Benchmark.bmbm do |bench|
bench.report 'stupid:' do
(2..10_000).each { |i| i.stupid_prime? }
end
bench.report 'tedious:' do
(2..10_000).each { |i| i.tedious_prime? }
end
bench.report 'simple:' do
(2..10_000).each { |i| i.simple_prime? }
end
bench.report 'clever:' do
(2..10_000).each { |i| i.clever_prime? }
end
bench.report 'stdlib:' do
(2..10_000).each { |i| i.prime? }
end
end
require './integer'
require 'prime'
limit = ARGV.first.to_i
method = ARGV.last.to_sym
sum = (2...limit).select(&method).inject :+
puts "sum(primes < #{limit}) = #{sum}"
#!/bin/sh
gem install ruby_core_source ruby-prof perftools.rb RubyInline
require 'inline'
class Integer
def stupid_prime?
prime = true
(2...self).each { |i| prime = false if (self % i).zero? }
prime
end
def tedious_prime?
(2...self).all? { |i| (self % i).nonzero? }
end
def simple_prime?
(2..Math.sqrt(self).floor).all? { |i| (self % i).nonzero? }
end
def clever_prime?
return true if self == 2
return false if self.even?
3.step(Math.sqrt(self).floor, 2).all? { |i| (self % i).nonzero? }
end
inline do |builder|
builder.c '
VALUE inline_simple() {
long number = NUM2LONG(self);
long i;
for (i = 2; i <= floor(sqrt(number)); i++) {
if (number % i == 0) return Qfalse;
}
return Qtrue;
}
'
end
inline do |builder|
builder.c '
VALUE inline_clever() {
long number = NUM2LONG(self);
if (number == 2) return Qtrue;
if (number % 2 == 0) return Qfalse;
long i = 3;
while (i <= floor(sqrt(number))) {
if (number % i == 0) return Qfalse;
i = i + 2;
}
return Qtrue;
}
'
end
end
require 'prime'
puts Prime.take_while { |p| p < 2_000_000 }.inject :+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment