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.
- 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
|