sieve 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"