writev 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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