writev 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +10 -0
- data/bench.rb +93 -20
- data/ext/writev/extconf.rb +1 -0
- data/ext/writev/writev.c +3 -0
- data/lib/writev.rb +1 -1
- data/test/test_writev.rb +9 -0
- metadata +79 -77
data/CHANGELOG.rdoc
CHANGED
@@ -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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
write
|
29
|
-
|
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
|
+
|
data/ext/writev/extconf.rb
CHANGED
data/ext/writev/writev.c
CHANGED
@@ -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
|
data/lib/writev.rb
CHANGED
data/test/test_writev.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
19
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
60
|
-
segments:
|
61
|
-
- 2
|
62
|
-
- 9
|
63
|
-
version: "2.9"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.0'
|
64
70
|
type: :development
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
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.
|
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
|