writev 1.0.1 → 1.0.2

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.
@@ -1,3 +1,13 @@
1
+ Thu Oct 11 18:45:15 2012 Aaron Patterson <aaron@tenderlovemaking.com>
2
+
3
+ * ext/writev/extconf.rb: check for rb_io_check_io
4
+ * ext/writev/writev.c: conditionally use built in function
5
+
6
+ Thu Oct 11 18:43:53 2012 Aaron Patterson <aaron@tenderlovemaking.com>
7
+
8
+ * ext/writev/writev.c: check for array type. Fixes #2
9
+ * test/test_writev.rb: appropriate test
10
+
1
11
  === 1.0.1 / 2011-08-19
2
12
 
3
13
  * 1 bug fixed
data/bench.rb CHANGED
@@ -2,28 +2,101 @@ require 'writev'
2
2
  require 'tempfile'
3
3
  require 'benchmark'
4
4
 
5
- LIST = File.readlines '/usr/share/dict/words'
6
- p LIST.length
7
-
8
- Benchmark.bm(7) do |x|
9
- x.report('write') {
10
- file = Tempfile.new('write')
11
- LIST.each { |l| file.write l }
12
- file.unlink
13
- }
14
- x.report('writev') {
15
- file = Tempfile.new('write1')
16
- LIST.each_slice(IO::IOV_MAX) do |slice|
17
- file.writev slice
5
+ def avg items
6
+ items.map { |item| item.length }.inject(:+) / items.length
7
+ end
8
+
9
+ def make_strings count, min, spread
10
+ strings = []
11
+
12
+ open '/dev/zero' do |io|
13
+ while strings.length < count do
14
+ strings << io.read(min + rand(spread))
18
15
  end
19
- file.unlink
20
- }
16
+ end
17
+
18
+ strings
21
19
  end
22
20
 
21
+ def bench list
22
+ p :length => list.length
23
+ p :avg_size => avg(list)
24
+
25
+ Benchmark.bm(13) do |x|
26
+ x.report('write') {
27
+ Tempfile.open 'write' do |file|
28
+ list.each { |l| file.write l }
29
+ end
30
+ }
31
+
32
+ x.report('write join') {
33
+ Tempfile.open 'write' do |file|
34
+ file.write list.join
35
+ end
36
+ }
37
+
38
+ x.report('syswrite') {
39
+ Tempfile.open 'write' do |file|
40
+ list.each { |l| file.syswrite l }
41
+ end
42
+ }
43
+
44
+ x.report('syswrite join') {
45
+ Tempfile.open 'write' do |file|
46
+ file.syswrite list.join
47
+ end
48
+ }
49
+
50
+ x.report('writev') {
51
+ Tempfile.open 'write' do |file|
52
+ list.each_slice(IO::IOV_MAX) do |slice|
53
+ file.writev slice
54
+ end
55
+ end
56
+ }
57
+ end
58
+
59
+ puts
60
+ end
61
+
62
+ list = File.readlines '/usr/share/dict/words'
63
+
64
+ bench list
65
+
66
+ list = make_strings list.length, 1024, 1024
67
+
68
+ bench list
69
+
70
+ list = make_strings (list.length / 4), 10240, 10240
71
+
72
+ bench list
73
+
23
74
  # /* vim: set et sws=2 sw=2: */
24
75
  __END__
25
- [aaron@higgins writev (master)]$ ruby -I lib bench.rb
26
- 235886
27
- user system total real
28
- write 0.270000 0.010000 0.280000 ( 0.293202)
29
- writev 0.020000 0.040000 0.060000 ( 0.087576)
76
+ {:length=>235886}
77
+ {:avg_size=>10}
78
+ user system total real
79
+ write 0.150000 0.010000 0.160000 ( 0.168736)
80
+ write join 0.020000 0.000000 0.020000 ( 0.020665)
81
+ syswrite 0.390000 0.500000 0.890000 ( 0.883507)
82
+ syswrite join 0.010000 0.000000 0.010000 ( 0.018780)
83
+ writev 0.030000 0.030000 0.060000 ( 0.051839)
84
+
85
+ {:length=>235886}
86
+ {:avg_size=>1535}
87
+ user system total real
88
+ write 0.330000 0.700000 1.030000 ( 5.380344)
89
+ write join 0.160000 0.450000 0.610000 ( 5.489569)
90
+ syswrite 0.430000 1.180000 1.610000 ( 5.433381)
91
+ syswrite join 0.140000 0.490000 0.630000 ( 5.723345)
92
+ writev 0.020000 0.300000 0.320000 ( 5.411284)
93
+
94
+ {:length=>58971}
95
+ {:avg_size=>15372}
96
+ user system total real
97
+ write 0.180000 1.120000 1.300000 ( 13.305516)
98
+ write join 0.360000 1.230000 1.590000 ( 15.051602)
99
+ syswrite 0.160000 1.120000 1.280000 ( 14.246432)
100
+ syswrite join 0.280000 1.280000 1.560000 ( 15.344061)
101
+ writev 0.000000 0.680000 0.680000 ( 14.185484)
102
+
@@ -1,3 +1,4 @@
1
1
  require 'mkmf'
2
2
 
3
+ have_func 'rb_io_check_io'
3
4
  create_makefile 'writev'
@@ -4,11 +4,13 @@
4
4
 
5
5
  VALUE rb_IOV_MAX;
6
6
 
7
+ #ifndef HAVE_RB_IO_CHECK_IO
7
8
  static VALUE
8
9
  rb_io_check_io(VALUE io)
9
10
  {
10
11
  return rb_check_convert_type(io, T_FILE, "IO", "to_io");
11
12
  }
13
+ #endif
12
14
 
13
15
  #define rb_sys_fail_path(path) rb_sys_fail(NIL_P(path) ? 0 : RSTRING_PTR(path))
14
16
 
@@ -20,6 +22,7 @@ static VALUE rb_writev(VALUE io, VALUE list)
20
22
  ssize_t written;
21
23
  VALUE tmp;
22
24
 
25
+ Check_Type(list, T_ARRAY);
23
26
  #ifdef IOV_MAX
24
27
  if(RARRAY_LEN(list) > IOV_MAX)
25
28
  #else
@@ -1,5 +1,5 @@
1
1
  require 'writev.so'
2
2
 
3
3
  module WriteV
4
- VERSION = '1.0.1'
4
+ VERSION = '1.0.2'
5
5
  end
@@ -11,6 +11,15 @@ class TestWritev < MiniTest::Unit::TestCase
11
11
  file.unlink
12
12
  end
13
13
 
14
+ def test_checks_arguments
15
+ file = Tempfile.new('foo')
16
+
17
+ assert_raises TypeError do
18
+ file.writev('hello')
19
+ end
20
+ file.unlink
21
+ end
22
+
14
23
  def test_length
15
24
  file = Tempfile.new('foo')
16
25
 
metadata CHANGED
@@ -1,82 +1,94 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: writev
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.2
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 1
10
- version: 1.0.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Aaron Patterson
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-08-19 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: minitest
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '4.1'
22
+ type: :development
22
23
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '4.1'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
24
33
  none: false
25
- requirements:
34
+ requirements:
26
35
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 5
29
- segments:
30
- - 2
31
- - 3
32
- version: "2.3"
36
+ - !ruby/object:Gem::Version
37
+ version: '3.10'
33
38
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rake-compiler
37
39
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.10'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake-compiler
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 13
44
- segments:
45
- - 0
46
- - 4
47
- - 1
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
48
53
  version: 0.4.1
49
54
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: hoe
53
55
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
55
57
  none: false
56
- requirements:
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.4.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: hoe
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
57
67
  - - ~>
58
- - !ruby/object:Gem::Version
59
- hash: 17
60
- segments:
61
- - 2
62
- - 9
63
- version: "2.9"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
64
70
  type: :development
65
- version_requirements: *id003
66
- description: |-
67
- This gem adds the `writev` method to IO. It provides access to the `writev`
68
- system call on your IO objects.
69
- email:
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.0'
78
+ description: ! 'This gem adds the `writev` method to IO. It provides access to the
79
+ `writev`
80
+
81
+ system call on your IO objects.'
82
+ email:
70
83
  - aaron@tenderlovemaking.com
71
84
  executables: []
72
-
73
- extensions:
85
+ extensions:
74
86
  - ext/writev/extconf.rb
75
- extra_rdoc_files:
76
- - Manifest.txt
87
+ extra_rdoc_files:
77
88
  - CHANGELOG.rdoc
89
+ - Manifest.txt
78
90
  - README.rdoc
79
- files:
91
+ files:
80
92
  - .autotest
81
93
  - CHANGELOG.rdoc
82
94
  - Manifest.txt
@@ -90,39 +102,29 @@ files:
90
102
  - .gemtest
91
103
  homepage: http://github.com/tenderlove/writev
92
104
  licenses: []
93
-
94
105
  post_install_message:
95
- rdoc_options:
106
+ rdoc_options:
96
107
  - --main
97
108
  - README.rdoc
98
- require_paths:
109
+ require_paths:
99
110
  - lib
100
- required_ruby_version: !ruby/object:Gem::Requirement
111
+ required_ruby_version: !ruby/object:Gem::Requirement
101
112
  none: false
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- hash: 55
106
- segments:
107
- - 1
108
- - 9
109
- - 2
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
110
116
  version: 1.9.2
111
- required_rubygems_version: !ruby/object:Gem::Requirement
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
118
  none: false
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- hash: 3
117
- segments:
118
- - 0
119
- version: "0"
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
120
123
  requirements: []
121
-
122
124
  rubyforge_project: writev
123
- rubygems_version: 1.8.8
125
+ rubygems_version: 1.8.24
124
126
  signing_key:
125
127
  specification_version: 3
126
128
  summary: This gem adds the `writev` method to IO
127
- test_files:
129
+ test_files:
128
130
  - test/test_writev.rb