startup-time 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5edbc737357924e55026244d924546b02dd43c3f875c710a4174027abb0bfc82
4
- data.tar.gz: 8c79da2fbbbf34be5dc0bae8115b33a7ccbe681493c4efea6f86028c20ad1f2b
3
+ metadata.gz: fb5446ede5073351faeb7fee768f11d0bbbf8aa223cf5ad8f69b7782b63f91e3
4
+ data.tar.gz: 699c670e0386d4701a589d25e4467e3f36ad8c6d9baf2c49fc1b4819b35318c5
5
5
  SHA512:
6
- metadata.gz: d37390eae5748fde5435c8a261a7b6888f12c870424500124d6aa0d8ba6baa357c4de0846685013bb6f4cc3fac9b5470a4f167e265c775e1f2dcdcc520e7cb9a
7
- data.tar.gz: 4eb78e5f8a43691d8f898b9fab7a23219e831c583836cf43fece6b3c9d1dc1d8af24170a0df7096a14a244cb4bdcb398035d7d8337a944606c0f964fa79abe97
6
+ metadata.gz: c7f577bdf5e4d5782825efe6562e97b2cc3210fd0471faf61fc052f1fc6ed6f798b93d8349a13cd652953f68a69096c2fe9cd45109ba3d3f15bb81207d3360a6
7
+ data.tar.gz: a8a74489a53efc48456fd20af5533e716fbef5731a1b853fefd1b9565734c07ea8e8b1ae28ac065862aec9a4ad5b05e06364941575f2dfc2f17a8963bf6067aa
@@ -1,3 +1,10 @@
1
+ ## 1.3.0 - 2019-09-11
2
+
3
+ - bump the default minimum duration from 5s to 10s
4
+ - disable the Java tests (javac, java-native) if `java` is installed but
5
+ `javac` isn't
6
+ - add [Wren](http://wren.io/)
7
+
1
8
  ## 1.2.0 - 2019-07-15
2
9
 
3
10
  - add -t/--time option specifying the minimum length of time to run tests for
@@ -6,7 +13,7 @@
6
13
 
7
14
  ## 1.1.1 - 2019-07-13
8
15
 
9
- - add QuickJS
16
+ - add [QuickJS](https://bellard.org/quickjs/)
10
17
  - update deno version command
11
18
 
12
19
  ## 1.1.0 - 2019-02-27
data/README.md CHANGED
@@ -49,8 +49,11 @@ $ startup-time --only jvm
49
49
  # only run tests which finish quickly
50
50
  $ startup-time --only fast --omit slow-compile
51
51
 
52
- # minimum number of seconds to run the test suite for (default: 5)
52
+ # run the test suite for at least 10 seconds (default: 5)
53
53
  $ startup-time --time 10
54
+
55
+ # run each program 10 times
56
+ $ startup-time --count 10
54
57
  ```
55
58
 
56
59
  ### Sample Output
@@ -62,24 +65,25 @@ $ startup-time --time 10
62
65
  LuaJIT 0.64
63
66
  Go 0.66
64
67
  Rust 0.67
68
+ JavaScript (QuickJS) 0.83
65
69
  D (DMD) 0.88
66
- JavaScript (QuickJS) 0.92
67
- Lua 0.98
70
+ Lua 0.94
71
+ Java Native (GraalVM) 0.99
68
72
  D (GDC) 1.10
69
73
  Haskell (GHC) 1.14
70
- C++ (g++) 1.22
71
- Crystal 1.63
74
+ Wren 1.14
75
+ C++ (g++) 1.19
76
+ Crystal 1.55
72
77
  Perl 1.66
73
- Java Native (GraalVM) 1.95
74
- Bash 2.67
78
+ Bash 2.63
79
+ JavaScript (GraalVM) 3.88
75
80
  JavaScript (Deno) 11.15
76
81
  Python 3 22.09
77
- JavaScript (GraalVM) 32.38
82
+ Ruby (TruffleRuby) 33.59
78
83
  JavaScript (Node.js) 35.20
79
84
  Python 2 43.43
80
85
  Java 54.59
81
- Ruby 67.40
82
- Ruby (TruffleRuby) 81.77
86
+ Ruby 68.68
83
87
  Kotlin 103.02
84
88
  Scala 801.21
85
89
 
@@ -118,7 +122,7 @@ OPTIONS:
118
122
  -O, --omit LIST Don't run the specified tests (comma-separated list of IDs/groups)
119
123
  -q, --quiet Suppress all inessential output
120
124
  -t, --time INTEGER The minimum number of seconds to run the test suite for
121
- (minimum: 2, default: 5)
125
+ (minimum: 2, default: 10)
122
126
  -v, --verbose Enable verbose logging
123
127
  -V, --version Display the version and exit
124
128
  ```
@@ -134,6 +138,7 @@ OPTIONS:
134
138
 
135
139
  ## SEE ALSO
136
140
 
141
+ - [Gabriel439/bench](https://github.com/Gabriel439/bench) - a command-line benchmark tool written in Haskell
137
142
  - [gnustavo/startup-times](https://github.com/gnustavo/startup-times) - a script to investigate the startup times of several programming languages
138
143
  - [jwiegley/helloworld](https://github.com/jwiegley/helloworld) - a comparison of "Hello, world" startup times in various languages
139
144
  - [sharkdp/hyperfine](https://github.com/sharkdp/hyperfine) - a command-line benchmarking tool
@@ -144,7 +149,7 @@ OPTIONS:
144
149
 
145
150
  ## VERSION
146
151
 
147
- 1.2.0
152
+ 1.3.0
148
153
 
149
154
  ## COPYRIGHT AND LICENSE
150
155
 
@@ -64,35 +64,9 @@ module StartupTime
64
64
  def benchmark
65
65
  builder.build!
66
66
 
67
- # run a test if:
68
- #
69
- # - its interpreter exists
70
- # - it's a compiled executable (i.e. its compiler exists)
71
- #
72
- # otherwise, skip it
73
- runnable_tests = selected_tests.each_with_object([]) do |(id, test), tests|
74
- args = Array(test[:command])
75
-
76
- if args.length == 1 # native executable
77
- compiler = test[:compiler] || id
78
- path = File.absolute_path(args.first)
79
- next unless File.exist?(path)
80
- else # interpreter + source
81
- compiler = args.first
82
- path = which(compiler)
83
- next unless path
84
- end
85
-
86
- tests << {
87
- id: id,
88
- test: test,
89
- args: args,
90
- compiler: compiler,
91
- path: path,
92
- }
93
- end
67
+ tests = runnable_tests
94
68
 
95
- if runnable_tests.empty?
69
+ if tests.empty?
96
70
  puts '[]' if @json
97
71
  return
98
72
  end
@@ -100,12 +74,11 @@ module StartupTime
100
74
  spec = @options.spec
101
75
 
102
76
  if spec.type == :duration
103
- spec = spec.with(value: spec.value.to_f / runnable_tests.length)
77
+ spec = spec.with(value: spec.value.to_f / tests.length)
104
78
  end
105
79
 
106
- runnable_tests.shuffle.each do |config|
107
- config[:spec] = spec
108
- time(config)
80
+ tests.shuffle.each do |test|
81
+ time(spec, test)
109
82
  end
110
83
 
111
84
  sorted = @times.sort_by { |result| result[:time] }
@@ -131,9 +104,54 @@ module StartupTime
131
104
  end
132
105
  end
133
106
 
107
+ # return the subset of selected tests that are runnable.
108
+ #
109
+ # a test is runnable if these requirements are met:
110
+ #
111
+ # - (if it's interpreted): the interpreter exists
112
+ # - (if it's compiled): the compiler exists
113
+ #
114
+ # otherwise, skip it
115
+ #
116
+ # the compiler path is resolved in the builder, which can also disable a test
117
+ # (by setting test[:disabled] = true) if the compilation prerequisites aren't
118
+ # installed
119
+ #
120
+ # note that some tests are both interpreted and compiled, so both the
121
+ # compiler and the interpreter must exist, e.g.:
122
+ #
123
+ # - interpreter: java
124
+ # - compiler: javac
125
+
126
+ def runnable_tests
127
+ selected_tests.each_with_object([]) do |(id, test), tests|
128
+ next if test[:disabled]
129
+
130
+ args = Array(test[:command])
131
+ compiler = test[:compiler]
132
+
133
+ if args.length == 1 # native executable
134
+ executable = File.absolute_path(args.first)
135
+ next unless File.exist?(executable)
136
+ else # interpreter + source/bytecode
137
+ executable = which(args.first)
138
+ next unless (interpreter = executable)
139
+ end
140
+
141
+ tests << {
142
+ args: args,
143
+ compiler: compiler,
144
+ executable: executable,
145
+ id: id,
146
+ interpreter: interpreter,
147
+ test: test,
148
+ }
149
+ end
150
+ end
151
+
134
152
  # takes a test configuration and measures how long it takes to execute the
135
153
  # test
136
- def time(id:, test:, args:, compiler:, path:, spec:)
154
+ def time(spec, args:, compiler:, executable:, id:, interpreter:, test:)
137
155
  # dump the compiler/interpreter's version if running in verbose mode
138
156
  if @verbosity == :verbose
139
157
  puts
@@ -144,19 +162,22 @@ module StartupTime
144
162
  version = test[:version]
145
163
 
146
164
  unless version == false
147
- version ||= '%{compiler} --version'
165
+ # if the test is both interpreted and compiled, default to
166
+ # dumping the compiler version
167
+ version ||= '%{compiler} --version' if compiler
168
+ version ||= '%{interpreter} --version' if interpreter
148
169
 
149
- # the compiler may have been uninstalled since the target was
150
- # built, so make sure it still exists
151
- if (compiler_path = which(compiler))
152
- version_command = version % { compiler: compiler_path }
153
- sh version_command
154
- end
170
+ version_command = version % {
171
+ compiler: compiler || interpreter,
172
+ interpreter: interpreter,
173
+ }
174
+
175
+ sh version_command
155
176
  end
156
177
  end
157
178
 
158
179
  argv0 = args.shift
159
- command = [path, *args]
180
+ command = [executable, *args]
160
181
 
161
182
  unless @verbosity == :quiet
162
183
  if @verbosity == :verbose
@@ -190,7 +211,7 @@ module StartupTime
190
211
 
191
212
  loop do
192
213
  time = Benchmark.realtime do
193
- system([path, argv0], *args, out: File::NULL)
214
+ system([executable, argv0], *args, out: File::NULL)
194
215
  end
195
216
 
196
217
  elapsed = Time.now - start
@@ -201,7 +222,7 @@ module StartupTime
201
222
  else # how many times to run the tests
202
223
  spec.value.times do
203
224
  times << Benchmark.realtime do
204
- system([path, argv0], *args, out: File::NULL)
225
+ system([executable, argv0], *args, out: File::NULL)
205
226
  end
206
227
  end
207
228
  end
@@ -1,9 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rake'
4
+ require 'set'
4
5
  require 'shellwords'
6
+
7
+ require_relative 'refinements'
5
8
  require_relative 'util'
6
9
 
10
+ using StartupTime::Refinements
11
+
7
12
  module StartupTime
8
13
  # StartupTime::Builder - clean and prepare the build directory
9
14
  #
@@ -16,6 +21,11 @@ module StartupTime
16
21
  # once these tasks are complete, everything required to run the benchmark tests
17
22
  # will be available in the build directory
18
23
  class Builder
24
+ CUSTOM_COMPILER = {
25
+ 'kotlinc-native': :compile_kotlinc_native,
26
+ 'java-native': :compile_java_native,
27
+ }
28
+
19
29
  SRC_DIR = File.absolute_path('../../resources/src', __dir__)
20
30
 
21
31
  include Rake::DSL
@@ -23,17 +33,12 @@ module StartupTime
23
33
  include Services.mixin %i[options selected_tests]
24
34
 
25
35
  def initialize
26
- @verbosity = options.verbosity
27
36
  @build_dir = options.build_dir
37
+ @verbosity = options.verbosity
28
38
 
29
39
  Rake.verbose(@verbosity != :quiet)
30
40
  end
31
41
 
32
- # remove the build directory and its contents
33
- def clean!
34
- rm_rf @build_dir
35
- end
36
-
37
42
  # ensure the build directory is in a fit state to run the tests i.e. copy
38
43
  # source files and compile target files
39
44
  def build!
@@ -47,27 +52,13 @@ module StartupTime
47
52
  Rake::Task[:build].invoke
48
53
  end
49
54
 
50
- private
51
-
52
- # a wrapper for Rake's +FileUtils#sh+ method (which wraps +Kernel#spawn+)
53
- # which allows the command's environment to be included in the final options
54
- # hash rather than cramming it in as the first argument i.e.:
55
- #
56
- # before:
57
- #
58
- # sh FOO_VERBOSE: "0", "foo -c hello.foo -o hello", out: File::NULL
59
- #
60
- # after:
61
- #
62
- # shell "foo -c hello.foo -o hello", env: { FOO_VERBOSE: "0" }, out: File::NULL
63
- #
64
- def shell(args, **options)
65
- args = Array(args) # args is a string or array
66
- env = options.delete(:env)
67
- args.unshift(env) if env
68
- sh(*args, options)
55
+ # remove the build directory and its contents
56
+ def clean!
57
+ rm_rf @build_dir
69
58
  end
70
59
 
60
+ private
61
+
71
62
  # a conditional version of Rake's `file` task which compiles a source file to
72
63
  # a target file via the block provided. if the compiler isn't installed, the
73
64
  # task is skipped.
@@ -88,6 +79,12 @@ module StartupTime
88
79
 
89
80
  return unless (compiler_path = which(compiler))
90
81
 
82
+ # update the test spec's compiler field to point to the compiler's
83
+ # absolute path
84
+ #
85
+ # XXX mutation/side-effect
86
+ test[:compiler] = compiler_path
87
+
91
88
  # the source filename must be supplied
92
89
  source = test.fetch(:source)
93
90
 
@@ -97,17 +94,13 @@ module StartupTime
97
94
 
98
95
  if command.length == 1
99
96
  target = command.first
100
- elsif source.match?(/^[A-Z]/) # JVM language
97
+ elsif source.match?(/\A[A-Z]/) # JVM language
101
98
  target = source.pathmap('%n.class')
102
99
  else # native executable
103
100
  target = '%s.out' % source
104
101
  end
105
102
  end
106
103
 
107
- # update the test spec's compiler field to point to the compiler's
108
- # absolute path (which may be mocked)
109
- test = test.merge(compiler: compiler_path)
110
-
111
104
  # pass the test object as the `file(...) { ... }` block's second
112
105
  # argument. Rake passes an instance of +Rake::TaskArguments+, a Hash-like
113
106
  # object which provides access to the command-line arguments for a Rake
@@ -119,22 +112,96 @@ module StartupTime
119
112
  # declare the prerequisites for the target file.
120
113
  # compiler_path: recompile if the compiler has been
121
114
  # updated since the target was last built
122
- file(target => [source, compiler_path], &wrapper)
115
+ file_task = file(target => [source, compiler_path], &wrapper)
123
116
 
124
- # add the target file to the build task
125
- task :build => target
117
+ # register the task under the supplied ID so it can be referenced by name
118
+ # rather than by filename
119
+ compile_task = task(id => file_task)
126
120
 
127
- target
121
+ # add the task which builds the target file to the build task as a
122
+ # prerequisite
123
+ # task(:build => target) unless options[:connect] == false
124
+ task(:build => compile_task) unless options[:connect] == false
125
+
126
+ compile_task
128
127
  end
129
128
 
130
- # register the prerequisites of the :build task. creates file tasks which:
131
- #
132
- # a) keep the build directory sources in sync with the source directory
133
- # b) rebuild target files if their source files are modified
134
- # c) rebuild target files if their compilers are updated
135
- def register_tasks
136
- copy_source_files
137
- compile_target_files
129
+ # native-image compiles .class files to native binaries. it differs from
130
+ # the other tasks because it depends on a target file rather than a
131
+ # source file i.e. it depends on the target of the javac task
132
+ def compile_java_native
133
+ java_native = compile_if('java-native', connect: false) do |t, test|
134
+ # XXX native-image doesn't provide a way to silence its output, so
135
+ # send it to /dev/null
136
+ shell [test[:compiler], "-H:Name=#{t.target}", '--no-server', '-O1', t.source.ext], {
137
+ out: File::NULL
138
+ }
139
+ end
140
+
141
+ return unless java_native # return a falsey value i.e. disable the test
142
+
143
+ javac = Rake.application.lookup(:javac) || begin
144
+ compile_if(:javac, connect: false, force: true) do |task, test|
145
+ run(test[:compile], task, test)
146
+ end
147
+ end
148
+
149
+ return unless javac # disable this test if javac is not available
150
+
151
+ # prepend the javac task to this task as a prerequisite
152
+ java_native.prepend(javac)
153
+
154
+ # register this task as a dependency of the root (:build) task
155
+ task(:build => java_native)
156
+
157
+ # uncomment this to see the dependency graph
158
+ # pp Rake::Task.tasks
159
+
160
+ java_native
161
+ end
162
+
163
+ # implement the compilation step for the kotlinc-native test manually. we
164
+ # need to do this to work around the compiler's non-standard behavior
165
+ def compile_kotlinc_native
166
+ compile_if 'kotlinc-native' do |t, test|
167
+ # XXX kotlinc-native doesn't provide a way to silence
168
+ # its debug messages, so file them under /dev/null
169
+ shell %W[#{test[:compiler]} -opt -o #{t.target} #{t.source}], out: File::NULL
170
+
171
+ # XXX work around a kotlinc-native "feature"
172
+ # https://github.com/JetBrains/kotlin-native/issues/967
173
+ exe = "#{t.target}.kexe" # XXX or .exe, or...
174
+ verbose(@verbosity == :verbose) { mv exe, t.target } if File.exist?(exe)
175
+ end
176
+ end
177
+
178
+ # make sure the target files (e.g. native executables and JVM .class files)
179
+ # are built if their compilers are installed
180
+ def compile_target_files
181
+ selected_tests.each do |id, test|
182
+ enabled = true
183
+
184
+ # handle the tests which have compile templates by a) turning them into
185
+ # blocks which substitute the compiler, source file and target file into
186
+ # the corresponding placeholders in the template, then b) executing the
187
+ # resulting command via +shell+
188
+
189
+ if (command = test[:compile])
190
+ block = ->(task, test_) { run(command, task, test_) }
191
+ enabled = compile_if(id, &block)
192
+ end
193
+
194
+ test[:disabled] = !enabled
195
+ end
196
+
197
+ # do these after the main pass so they can reuse tasks (if available)
198
+ # e.g. the javac task
199
+
200
+ CUSTOM_COMPILER.each do |id, meth|
201
+ selected_tests[id].tap do |test|
202
+ test[:disabled] = !send(meth) if test
203
+ end
204
+ end
138
205
  end
139
206
 
140
207
  # ensure each file in the source directory is mirrored to the build
@@ -152,6 +219,16 @@ module StartupTime
152
219
  end
153
220
  end
154
221
 
222
+ # register the prerequisites of the :build task. creates file tasks which:
223
+ #
224
+ # a) keep the build directory sources in sync with the source directory
225
+ # b) rebuild target files if their source files are modified
226
+ # c) rebuild target files if their compilers are updated
227
+ def register_tasks
228
+ copy_source_files
229
+ compile_target_files
230
+ end
231
+
155
232
  # run a shell command (string) by substituting the compiler path, source
156
233
  # file, and target file into the supplied template string and executing the
157
234
  # resulting command with the test's (optional) environment hash
@@ -159,63 +236,30 @@ module StartupTime
159
236
  replacements = {
160
237
  compiler: Shellwords.escape(test[:compiler]),
161
238
  source: Shellwords.escape(task.source),
162
- target: Shellwords.escape(task.name),
239
+ target: Shellwords.escape(task.target),
163
240
  }
164
241
 
165
242
  command = template % replacements
166
243
  shell(command, env: test[:env])
167
244
  end
168
245
 
169
- # make sure the target files (e.g. native executables and JVM .class files)
170
- # are built if their compilers are installed
171
- def compile_target_files
172
- # handle the tests which have compile templates by turning them into
173
- # blocks which substitute the compiler, source file and target file into
174
- # the corresponding placeholders in the template and then execute the
175
- # command via `shell`
176
- selected_tests.each do |id, selected|
177
- if (command = selected[:compile])
178
- block = ->(task, test) { run(command, task, test) }
179
- compile_if(id, &block)
180
- end
181
- end
182
-
183
- # native-image compiles .class files to native binaries. it differs from
184
- # the other tasks because it depends on a target file rather than a
185
- # source file i.e. it depends on the target of the javac task
186
- java_native = compile_if('java-native', connect: false) do |t, test|
187
- # XXX native-image doesn't provide a way to silence its output, so
188
- # send it to /dev/null
189
- shell [test[:compiler], "-H:Name=#{t.name}", '--no-server', '-O1', t.source.ext], {
190
- out: File::NULL
191
- }
192
- end
193
-
194
- if java_native
195
- javac = compile_if(:javac, connect: false, force: true) do |task, test|
196
- run('%{compiler} -d . %{source}', task, test)
197
- end
198
-
199
- if javac
200
- task java_native => javac
201
- task :build => java_native
202
- end
203
- else
204
- compile_if :javac do |task, test|
205
- run('%{compiler} -d . %{source}', task, test)
206
- end
207
- end
208
-
209
- compile_if 'kotlinc-native' do |t, test|
210
- # XXX kotlinc-native doesn't provide a way to silence
211
- # its debug messages, so file them under /dev/null
212
- shell %W[#{test[:compiler]} -opt -o #{t.name} #{t.source}], out: File::NULL
213
-
214
- # XXX work around a kotlinc-native "feature"
215
- # https://github.com/JetBrains/kotlin-native/issues/967
216
- exe = "#{t.name}.kexe" # XXX or .exe, or...
217
- verbose(@verbosity == :verbose) { mv exe, t.name } if File.exist?(exe)
218
- end
246
+ # a wrapper for Rake's +FileUtils#sh+ method (which wraps +Kernel#spawn+)
247
+ # which allows the command's environment to be included in the final options
248
+ # hash rather than cramming it in as the first argument i.e.:
249
+ #
250
+ # before:
251
+ #
252
+ # sh FOO_VERBOSE: "0", "foo -c hello.foo -o hello", out: File::NULL
253
+ #
254
+ # after:
255
+ #
256
+ # shell "foo -c hello.foo -o hello", env: { FOO_VERBOSE: "0" }, out: File::NULL
257
+ #
258
+ def shell(args, **options)
259
+ args = Array(args) # args is a string or array
260
+ env = options.delete(:env)
261
+ args.unshift(env) if env
262
+ sh(*args, options)
219
263
  end
220
264
  end
221
265
  end
@@ -9,7 +9,7 @@ module StartupTime
9
9
  # overridden on the command line
10
10
  class Options
11
11
  BUILD_DIR = EnvPaths.get('startup-time', suffix: false).cache
12
- DEFAULT_DURATION = 5
12
+ DEFAULT_DURATION = 10
13
13
  MINIMUM_DURATION = 2
14
14
 
15
15
  Spec = Value.new(:type, :value)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rake'
4
+
5
+ module StartupTime
6
+ # add some missing methods/aliases to Rake tasks
7
+ # TODO move to a gem (or PR)
8
+ module Refinements
9
+ refine Rake::FileTask do
10
+ alias_method :target, :name
11
+ end
12
+
13
+ refine Rake::Task do
14
+ alias_method :append, :enhance
15
+
16
+ def prepend(deps = nil, &block)
17
+ prerequisites.replace(Array(deps) | prerequisites) if deps
18
+ actions.unshift(block) if block_given?
19
+ self
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StartupTime
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
@@ -0,0 +1 @@
1
+ System.print("Hello, world!")
@@ -21,6 +21,7 @@ crystal:
21
21
  - slow-compile
22
22
  source: hello.cr
23
23
  compile: '%{compiler} build --release -o %{target} %{source}'
24
+ version: '%{compiler} --version | head -n1'
24
25
  command: hello.cr.out
25
26
  env:
26
27
  CRYSTAL_CACHE_DIR: .crystal
@@ -123,7 +124,8 @@ javac:
123
124
  - java
124
125
  - jvm
125
126
  source: HelloJava.java
126
- version: '%{compiler} -version'
127
+ compile: '%{compiler} -d . %{source}'
128
+ version: '%{compiler} -version' # we could dump the interpeter version as well/instead
127
129
  command:
128
130
  - java
129
131
  - HelloJava
@@ -313,3 +315,12 @@ truffle-ruby:
313
315
  command:
314
316
  - truffleruby
315
317
  - hello.rb
318
+
319
+ wren:
320
+ name: Wren
321
+ groups:
322
+ - fast
323
+ - script
324
+ command:
325
+ - wren
326
+ - hello.wren
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: startup-time
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - chocolateboy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-15 00:00:00.000000000 Z
11
+ date: 2019-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -180,6 +180,7 @@ files:
180
180
  - lib/startup_time/app.rb
181
181
  - lib/startup_time/builder.rb
182
182
  - lib/startup_time/options.rb
183
+ - lib/startup_time/refinements.rb
183
184
  - lib/startup_time/registry.rb
184
185
  - lib/startup_time/services.rb
185
186
  - lib/startup_time/util.rb
@@ -202,6 +203,7 @@ files:
202
203
  - resources/src/hello.py
203
204
  - resources/src/hello.rb
204
205
  - resources/src/hello.rs
206
+ - resources/src/hello.wren
205
207
  - resources/tests.yaml
206
208
  homepage: https://github.com/chocolateboy/startup-time
207
209
  licenses:
@@ -226,7 +228,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
228
  - !ruby/object:Gem::Version
227
229
  version: '0'
228
230
  requirements: []
229
- rubygems_version: 3.0.4
231
+ rubygems_version: 3.0.6
230
232
  signing_key:
231
233
  specification_version: 4
232
234
  summary: A command-line tool to measure the startup times of programs in various languages