posix-spawn 0.3.12 → 0.3.13
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.
- checksums.yaml +4 -4
- data/bin/posix-spawn-benchmark +16 -116
- data/ext/posix-spawn.c +8 -4
- data/lib/posix/spawn.rb +4 -4
- data/lib/posix/spawn/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 586d0f0f9057e34308bf74b8012308d58554be84
|
4
|
+
data.tar.gz: fc46031fe4302b9c09bac390c758006e06d42a14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41c48ddad2fb6bd679db842a9ab7afb37b0c07963b143e8c3e9537a48216b0b61a7761c2f2214fdfd5f30072c9d0429717aa65cfc2e005e1797a7b2802486391
|
7
|
+
data.tar.gz: f18771b44bff3cf3ce268abb4969ab2a4750df248bcab1ed027fcb84e475b1172aaadfb7051451dda475391cfeabfe8100fd4b1dc818ba82d7e20f9bfcd82188
|
data/bin/posix-spawn-benchmark
CHANGED
@@ -1,117 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
graphmode = false
|
19
|
-
ARGV.options do |o|
|
20
|
-
o.set_summary_indent(' ')
|
21
|
-
o.on("-n", "--count=num") { |val| iterations = val.to_i }
|
22
|
-
o.on("-m", "--mem-size=MB") { |val| allocate = val.to_i * (1024 ** 2) }
|
23
|
-
o.on("-g", "--graph") { graphmode = true }
|
24
|
-
o.on_tail("-h", "--help") { exec "grep ^#/ <'#{__FILE__}' |cut -c4-" }
|
25
|
-
o.parse!
|
26
|
-
end
|
27
|
-
|
28
|
-
if graphmode
|
29
|
-
bloat = []
|
30
|
-
data = {}
|
31
|
-
chunk = allocate / 10
|
32
|
-
max = 0
|
33
|
-
|
34
|
-
10.times do
|
35
|
-
puts "allocating #{chunk / (1024 ** 2)}MB (#{(bloat.size+1) * chunk / (1024 ** 2)}MB total)"
|
36
|
-
bloat << ('x' * chunk)
|
37
|
-
# size = bloat.size / (1024 ** 2)
|
38
|
-
|
39
|
-
%w[ fspawn pspawn ].each do |type|
|
40
|
-
print " - benchmarking #{type}... "
|
41
|
-
time = Benchmark.realtime do
|
42
|
-
iterations.times do
|
43
|
-
pid = POSIX::Spawn.send(type, 'true')
|
44
|
-
Process.wait(pid)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
puts "done (#{time})"
|
48
|
-
|
49
|
-
data[type] ||= []
|
50
|
-
data[type] << time
|
51
|
-
max = time if time > max
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
max = max < 0.5 ? (max * 10).round / 10.0 : max.ceil
|
56
|
-
minmb, maxmb = chunk/(1024**2), allocate/(1024**2)
|
57
|
-
series = %w[ fspawn pspawn ].map{|name| data[name].map{|d| "%.2f" % d }.join(',') }
|
58
|
-
|
59
|
-
chart = {
|
60
|
-
:chs => '900x200',
|
61
|
-
:cht => 'bvg', # grouped vertical bar chart
|
62
|
-
:chtt => "posix-spawn-benchmark --graph --count #{iterations} --mem-size #{maxmb} (#{RUBY_PLATFORM})",
|
63
|
-
|
64
|
-
:chf => 'bg,s,f8f8f8', # background
|
65
|
-
:chbh => 'a,5,25', # 25px between bar groups
|
66
|
-
|
67
|
-
:chd => "t:#{series.join('|')}", # data
|
68
|
-
:chds => "0,#{max}", # scale
|
69
|
-
:chdl => 'fspawn (fork+exec)|pspawn (posix_spawn)', # legend
|
70
|
-
:chco => '1f77b4,ff7f0e', # colors
|
71
|
-
|
72
|
-
:chxt => 'x,y',
|
73
|
-
:chxr => "1,0,#{max},#{max/5}", # y labels up to max time
|
74
|
-
:chxs => '1N** secs', # y labels are +=' secs'
|
75
|
-
:chxl => "0:|#{minmb.step(maxmb, maxmb/10).map{ |mb| "#{mb} MB"}.join('|')}", # x bucket labels
|
76
|
-
}
|
77
|
-
|
78
|
-
url = "https://chart.googleapis.com/chart?"
|
79
|
-
url += chart.map do |key, val|
|
80
|
-
"#{key}=#{val.gsub(' ','%20').gsub('(','%28').gsub(')','%29').gsub('+','%2B')}"
|
81
|
-
end.join('&')
|
82
|
-
url += '#.png'
|
83
|
-
|
84
|
-
puts url
|
85
|
-
|
86
|
-
exit!
|
87
|
-
end
|
88
|
-
|
89
|
-
puts "benchmarking fork/exec vs. posix_spawn over #{iterations} runs" +
|
90
|
-
" at #{allocate / (1024 ** 2)}M res"
|
91
|
-
|
92
|
-
# bloat the process
|
93
|
-
bloat = 'x' * allocate
|
94
|
-
|
95
|
-
# run the benchmarks
|
96
|
-
bm 40 do |x|
|
97
|
-
x.report("fspawn (fork/exec):") do
|
98
|
-
iterations.times do
|
99
|
-
pid = POSIX::Spawn.fspawn('true')
|
100
|
-
Process.wait(pid)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
x.report("pspawn (posix_spawn):") do
|
104
|
-
iterations.times do
|
105
|
-
pid = POSIX::Spawn.pspawn('true')
|
106
|
-
Process.wait(pid)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
if Process.respond_to?(:spawn)
|
110
|
-
x.report("spawn (native):") do
|
111
|
-
iterations.times do
|
112
|
-
pid = Process.spawn('true')
|
113
|
-
Process.wait(pid)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'posix-spawn-benchmark' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("posix-spawn", "posix-spawn-benchmark")
|
data/ext/posix-spawn.c
CHANGED
@@ -45,7 +45,7 @@ static VALUE rb_mPOSIXSpawn;
|
|
45
45
|
* an actual fd number:
|
46
46
|
* - The symbols :in, :out, or :err for fds 0, 1, or 2.
|
47
47
|
* - An IO object. (IO#fileno is returned)
|
48
|
-
* -
|
48
|
+
* - An Integer.
|
49
49
|
*
|
50
50
|
* Returns the fd number >= 0 if one could be established, or -1 if the object
|
51
51
|
* does not map to an fd.
|
@@ -56,8 +56,12 @@ posixspawn_obj_to_fd(VALUE obj)
|
|
56
56
|
int fd = -1;
|
57
57
|
switch (TYPE(obj)) {
|
58
58
|
case T_FIXNUM:
|
59
|
-
|
60
|
-
fd
|
59
|
+
case T_BIGNUM:
|
60
|
+
/* Integer fd number
|
61
|
+
* rb_fix2int takes care of raising if the provided object is a
|
62
|
+
* Bignum and is out of range of an int
|
63
|
+
*/
|
64
|
+
fd = (int)rb_fix2int(obj);
|
61
65
|
break;
|
62
66
|
|
63
67
|
case T_SYMBOL:
|
@@ -94,7 +98,7 @@ posixspawn_obj_to_fd(VALUE obj)
|
|
94
98
|
/*
|
95
99
|
* Hash iterator that sets up the posix_spawn_file_actions_t with addclose
|
96
100
|
* operations. Only hash pairs whose value is :close are processed. Keys may
|
97
|
-
* be the :in, :out, :err, an IO object, or
|
101
|
+
* be the :in, :out, :err, an IO object, or an Integer fd number.
|
98
102
|
*
|
99
103
|
* Returns ST_DELETE when an addclose operation was added; ST_CONTINUE when
|
100
104
|
* no operation was performed.
|
data/lib/posix/spawn.rb
CHANGED
@@ -85,7 +85,7 @@ module POSIX
|
|
85
85
|
#
|
86
86
|
# spawn(command, :chdir => "/var/tmp")
|
87
87
|
#
|
88
|
-
# The :in, :out, :err,
|
88
|
+
# The :in, :out, :err, an Integer, an IO object or an Array option specify
|
89
89
|
# fd redirection. For example, stderr can be merged into stdout as follows:
|
90
90
|
#
|
91
91
|
# spawn(command, :err => :out)
|
@@ -460,11 +460,11 @@ module POSIX
|
|
460
460
|
|
461
461
|
# Determine whether object is fd-like.
|
462
462
|
#
|
463
|
-
# Returns true if object is an instance of IO,
|
463
|
+
# Returns true if object is an instance of IO, Integer >= 0, or one of the
|
464
464
|
# the symbolic names :in, :out, or :err.
|
465
465
|
def fd?(object)
|
466
466
|
case object
|
467
|
-
when
|
467
|
+
when Integer
|
468
468
|
object >= 0
|
469
469
|
when :in, :out, :err, STDIN, STDOUT, STDERR, $stdin, $stdout, $stderr, IO
|
470
470
|
true
|
@@ -486,7 +486,7 @@ module POSIX
|
|
486
486
|
STDOUT
|
487
487
|
when :err, 2
|
488
488
|
STDERR
|
489
|
-
when
|
489
|
+
when Integer
|
490
490
|
object >= 0 ? IO.for_fd(object) : nil
|
491
491
|
when IO
|
492
492
|
object
|
data/lib/posix/spawn/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: posix-spawn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Tomayko
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-01-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake-compiler
|
@@ -92,9 +92,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
92
|
version: '0'
|
93
93
|
requirements: []
|
94
94
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.5.2
|
96
96
|
signing_key:
|
97
97
|
specification_version: 4
|
98
98
|
summary: posix_spawnp(2) for ruby
|
99
99
|
test_files: []
|
100
|
-
has_rdoc:
|