sieve 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/Rakefile +14 -2
  2. data/ext/sieve/sieve.c +9 -8
  3. data/lib/sieve.rb +1 -1
  4. metadata +6 -3
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require "rubygems"
2
2
  require "rake"
3
3
  require "benchmark"
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib"))
4
6
  require "sieve"
5
7
 
6
8
  require "rake/extensiontask"
@@ -8,15 +10,17 @@ Rake::ExtensionTask.new("sieve") do |extension|
8
10
  extension.lib_dir = "lib/sieve"
9
11
  end
10
12
 
13
+ task :build => [:clean, :compile]
14
+
11
15
  require "cucumber/rake/task"
12
- Cucumber::Rake::Task.new(:cucumber => [:clean, :compile]) do |t|
16
+ Cucumber::Rake::Task.new(:cucumber => :build) do |t|
13
17
  t.rcov = true
14
18
  end
15
19
 
16
20
  task :default => :cucumber
17
21
 
18
22
  desc "Benchmark C implementation against pure Ruby implementation of the Sieve"
19
- task(:benchmark => [:clean, :compile]) do
23
+ task(:benchmark => :build) do
20
24
  def sieve(n)
21
25
  numbers = (0..n).map {|i| i }
22
26
  numbers[0] = numbers[1] = nil
@@ -43,5 +47,13 @@ task(:benchmark => [:clean, :compile]) do
43
47
  i.sieve
44
48
  end
45
49
  end
50
+
51
+ benchmark.report("sieve 10_000_000") do
52
+ sieve 10_000_000
53
+ end
54
+
55
+ benchmark.report("10_000_000.sieve") do
56
+ 10_000_000.sieve
57
+ end
46
58
  end
47
59
  end
@@ -11,34 +11,35 @@ void Init_sieve() {
11
11
 
12
12
  static VALUE sieve(const VALUE self) {
13
13
  if(NUM2LONG(self) < 2) { return Qnil; }
14
- long number = NUM2LONG(self) + 1,
15
- * numbers = malloc(number * sizeof(long));
14
+ long number = NUM2LONG(self) + 1;
15
+ short* numbers = malloc(number * sizeof(short));
16
16
 
17
17
  if(numbers == NULL) {
18
18
  rb_raise(rb_eNoMemError, "Can't allocate enough memory.");
19
19
  }
20
20
 
21
- numbers[0] = numbers[1] = -1;
21
+ numbers[0] = numbers[1] = 0;
22
22
  long i;
23
- for(i = 2; i < number; i++) { numbers[i] = i; }
23
+ for(i = 2; i < number; i++) { numbers[i] = 1; }
24
24
 
25
25
  long current_square;
26
26
  for(i = 0; i < number; i++) {
27
- if(numbers[i] == -1) { continue; }
27
+ if(numbers[i] == 0) { continue; }
28
28
 
29
29
  current_square = powl(i, 2);
30
30
  if(current_square > number) { break; }
31
31
 
32
32
  long n;
33
33
  for(n = current_square; n < number; n += i) {
34
- numbers[n] = -1;
34
+ numbers[n] = 0;
35
35
  }
36
36
  }
37
37
 
38
38
  VALUE primes_array = rb_ary_new();
39
39
  for(i = 0; i < number; i++) {
40
- if(numbers[i] == -1) { continue; }
41
- rb_ary_push(primes_array, LONG2FIX(numbers[i]));
40
+ if(numbers[i] == 1) {
41
+ rb_ary_push(primes_array, LONG2FIX(i));
42
+ }
42
43
  }
43
44
 
44
45
  free(numbers);
@@ -1,5 +1,5 @@
1
1
  require "sieve/sieve"
2
2
 
3
3
  module Sieve
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sieve
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 25
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 1
8
- - 0
9
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - Josh Clayton
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-08-29 00:00:00 -04:00
18
+ date: 2010-09-12 00:00:00 -04:00
18
19
  default_executable:
19
20
  dependencies: []
20
21
 
@@ -54,6 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
55
  requirements:
55
56
  - - ">="
56
57
  - !ruby/object:Gem::Version
58
+ hash: 3
57
59
  segments:
58
60
  - 0
59
61
  version: "0"
@@ -62,6 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
64
  requirements:
63
65
  - - ">="
64
66
  - !ruby/object:Gem::Version
67
+ hash: 3
65
68
  segments:
66
69
  - 0
67
70
  version: "0"