koine-profiler 0.1.0 → 2.0.0
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 +5 -5
- data/.rspec +0 -1
- data/LICENSE.txt +1 -1
- data/README.md +11 -7
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/examples/profiling_example.rb +40 -0
- data/koine-profiler.gemspec +20 -18
- data/lib/koine/profiler.rb +26 -9
- data/lib/koine/profiler/entry.rb +15 -9
- data/lib/koine/profiler/reporters/cli.rb +2 -2
- data/lib/koine/profiler/version.rb +1 -1
- metadata +34 -8
- data/lib/koine/profiler/entries.rb +0 -79
- data/lib/koine/profiler/entry_group.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2603470fb2462b192b7290f6930c6c3aa4a71b94a198eb01ea34a4d0e1bcd90e
|
4
|
+
data.tar.gz: e9d010acbfd05cfeb38dc721c87daf27517e7d049813a7a50ca210145c43810b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30d0fc8cbb86571c2e7142a4af368c64ac715998f8522db06624548630cddb67d9f96cb7b0482e6f3e36cd9208054c39e578554ee6f48d9a25e1236107a2c8a2
|
7
|
+
data.tar.gz: 8e41780379d1db9d9c44ce5edc46c032ee00a9cabe43a189bdd1e04adf1d7e949260bbab2c2fc6601bff927b26fb0d469b97481e30720ee0045d38b1a0ad45c7
|
data/.rspec
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -5,8 +5,6 @@ Simple profiler
|
|
5
5
|
[](https://travis-ci.org/mjacobus/koine-profiler)
|
6
6
|
[](https://scrutinizer-ci.com/g/mjacobus/koine-profiler/?branch=master)
|
7
7
|
[](https://codeclimate.com/github/mjacobus/koine-profiler)
|
8
|
-
[](https://scrutinizer-ci.com/g/mjacobus/koine-profiler/?branch=master)
|
9
|
-
[](https://gemnasium.com/mjacobus/koine-profiler)
|
10
8
|
[](https://badge.fury.io/rb/koine-profiler)
|
11
9
|
|
12
10
|
## Installation
|
@@ -28,6 +26,8 @@ Or install it yourself as:
|
|
28
26
|
## Usage
|
29
27
|
|
30
28
|
```ruby
|
29
|
+
profiler = Koine::Profiler.new
|
30
|
+
|
31
31
|
profiler.profile('some potentially slow task') do
|
32
32
|
potentially_slow()
|
33
33
|
end
|
@@ -44,12 +44,16 @@ require 'koine/profiler/reporters/cli'
|
|
44
44
|
|
45
45
|
reporter = Koine::Profiler::Reporters::Cli.new
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
reporter.report(reporter.entries)
|
48
|
+
```
|
49
|
+
|
50
|
+
Output example:
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
```text
|
53
|
+
+----------------------------+-------------------+--------------+---------+
|
54
|
+
| Entry | Elapsed Time | Memory | # hits |
|
55
|
+
| some potentially slow task | 48.59363997100241 | 7.5625 | 1000000 |
|
56
|
+
+----------------------------+-------------------+--------------+---------+
|
53
57
|
```
|
54
58
|
|
55
59
|
## Development
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'koine/profiler'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "koine/profiler"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start(__FILE__)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'koine/profiler'
|
3
|
+
require 'koine/profiler/reporters/cli'
|
4
|
+
|
5
|
+
MAX = 1_000_000
|
6
|
+
|
7
|
+
reporter = Koine::Profiler::Reporters::Cli.new
|
8
|
+
profiler = Koine::Profiler.instance
|
9
|
+
|
10
|
+
profiler.profile('arrays integers') do
|
11
|
+
data = []
|
12
|
+
1.upto(MAX).each do |num|
|
13
|
+
profiler.profile('arrays integers item') do
|
14
|
+
data << num
|
15
|
+
end
|
16
|
+
end
|
17
|
+
data.length
|
18
|
+
end
|
19
|
+
|
20
|
+
profiler.profile('arrays hashes') do
|
21
|
+
data = []
|
22
|
+
1.upto(MAX).each do |num|
|
23
|
+
profiler.profile('arrays hashes item') do
|
24
|
+
data << { num: num }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
data.length
|
28
|
+
end
|
29
|
+
|
30
|
+
reporter.report(profiler.entries)
|
31
|
+
|
32
|
+
# Output example:
|
33
|
+
#
|
34
|
+
# +----------------------+-------------------+--------------+---------+
|
35
|
+
# | Entry | Elapsed Time | Memory | # hits |
|
36
|
+
# | arrays integers item | 48.59363997100241 | 7.5625 | 1000000 |
|
37
|
+
# | arrays integers | 50.281231385 | 8.14453125 | 1 |
|
38
|
+
# | arrays hashes item | 64.81660490299825 | 152.8828125 | 1000000 |
|
39
|
+
# | arrays hashes | 66.691896445 | 264.04296875 | 1 |
|
40
|
+
# +----------------------+-------------------+--------------+---------+
|
data/koine-profiler.gemspec
CHANGED
@@ -4,36 +4,38 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'koine/profiler/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'koine-profiler'
|
8
8
|
spec.version = Koine::Profiler::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Marcelo Jacobus']
|
10
|
+
spec.email = ['marcelo.jacobus@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
12
|
+
spec.summary = 'A simple profiler'
|
13
|
+
spec.description = 'A simple profiler for profiling tests, for instance'
|
14
|
+
spec.homepage = 'https://github.com/mjacobus/koine-profiler'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
18
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
19
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] =
|
20
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
21
21
|
else
|
22
|
-
|
23
|
-
|
22
|
+
fail 'RubyGems 2.0 or newer is required to protect against ' \
|
23
|
+
'public gem pushes.'
|
24
24
|
end
|
25
25
|
|
26
|
-
spec.files
|
26
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
27
27
|
f.match(%r{^(test|spec|features)/})
|
28
28
|
end
|
29
|
-
spec.bindir =
|
29
|
+
spec.bindir = 'exe'
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
|
-
spec.require_paths = [
|
31
|
+
spec.require_paths = ['lib']
|
32
32
|
|
33
33
|
spec.add_dependency 'terminal-table'
|
34
|
-
spec.
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
34
|
+
spec.add_dependency 'get_process_mem'
|
35
|
+
spec.add_development_dependency 'simplecov'
|
36
|
+
spec.add_development_dependency 'object_comparator'
|
37
|
+
spec.add_development_dependency 'coveralls'
|
38
|
+
spec.add_development_dependency 'bundler', '~> 2.1.4'
|
39
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
40
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
39
41
|
end
|
data/lib/koine/profiler.rb
CHANGED
@@ -1,24 +1,41 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require "koine/profiler/entry"
|
1
|
+
require 'koine/profiler/version'
|
2
|
+
require 'koine/profiler/entry'
|
3
|
+
require 'get_process_mem'
|
5
4
|
|
6
5
|
module Koine
|
7
6
|
class Profiler
|
8
|
-
attr_reader :entries
|
9
|
-
|
10
7
|
def initialize
|
11
|
-
@entries =
|
8
|
+
@entries = {}
|
12
9
|
end
|
13
10
|
|
14
11
|
def profile(name)
|
15
12
|
value = nil
|
16
13
|
start_time = Time.now.utc
|
14
|
+
start_memory = GetProcessMem.new.mb
|
17
15
|
value = yield if block_given?
|
16
|
+
finish_memory = GetProcessMem.new.mb
|
18
17
|
finish_time = Time.now.utc
|
19
|
-
|
20
|
-
|
18
|
+
add_entry(
|
19
|
+
name,
|
20
|
+
time: finish_time - start_time,
|
21
|
+
memory: finish_memory - start_memory
|
22
|
+
)
|
21
23
|
value
|
22
24
|
end
|
25
|
+
|
26
|
+
def entries
|
27
|
+
@entries.values
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.instance
|
31
|
+
@instance ||= new
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def add_entry(name, time:, memory:)
|
37
|
+
entry = @entries[name] ||= Entry.new(name)
|
38
|
+
entry.increment(elapsed_time: time, memory_used: memory)
|
39
|
+
end
|
23
40
|
end
|
24
41
|
end
|
data/lib/koine/profiler/entry.rb
CHANGED
@@ -1,18 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Koine
|
2
4
|
class Profiler
|
3
5
|
class Entry
|
4
|
-
attr_reader :name
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
6
|
+
attr_reader :name
|
7
|
+
attr_reader :elapsed_time
|
8
|
+
attr_reader :memory_used
|
9
|
+
attr_reader :hits
|
9
10
|
|
10
|
-
def
|
11
|
-
|
11
|
+
def initialize(name)
|
12
|
+
@name = name
|
13
|
+
@elapsed_time = 0
|
14
|
+
@memory_used = 0
|
15
|
+
@hits = 0
|
12
16
|
end
|
13
17
|
|
14
|
-
def
|
15
|
-
|
18
|
+
def increment(elapsed_time:, memory_used:)
|
19
|
+
@hits += 1
|
20
|
+
@elapsed_time += elapsed_time
|
21
|
+
@memory_used += memory_used
|
16
22
|
end
|
17
23
|
end
|
18
24
|
end
|
@@ -10,10 +10,10 @@ module Koine
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def report(entries)
|
13
|
-
@table << ['Entry', 'Elapsed Time', '#
|
13
|
+
@table << ['Entry', 'Elapsed Time', 'Memory', '# hits']
|
14
14
|
|
15
15
|
entries.each do |entry|
|
16
|
-
@table << [entry.name, entry.elapsed_time, entry.
|
16
|
+
@table << [entry.name, entry.elapsed_time, entry.memory_used, entry.hits]
|
17
17
|
end
|
18
18
|
|
19
19
|
@output << @table
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: koine-profiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcelo Jacobus
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: terminal-table
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: get_process_mem
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: simplecov
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,20 @@ dependencies:
|
|
38
52
|
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: object_comparator
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: coveralls
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,14 +86,14 @@ dependencies:
|
|
58
86
|
requirements:
|
59
87
|
- - "~>"
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
89
|
+
version: 2.1.4
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
96
|
+
version: 2.1.4
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rake
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,11 +139,10 @@ files:
|
|
111
139
|
- Rakefile
|
112
140
|
- bin/console
|
113
141
|
- bin/setup
|
142
|
+
- examples/profiling_example.rb
|
114
143
|
- koine-profiler.gemspec
|
115
144
|
- lib/koine/profiler.rb
|
116
|
-
- lib/koine/profiler/entries.rb
|
117
145
|
- lib/koine/profiler/entry.rb
|
118
|
-
- lib/koine/profiler/entry_group.rb
|
119
146
|
- lib/koine/profiler/reporters/cli.rb
|
120
147
|
- lib/koine/profiler/version.rb
|
121
148
|
homepage: https://github.com/mjacobus/koine-profiler
|
@@ -138,8 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
165
|
- !ruby/object:Gem::Version
|
139
166
|
version: '0'
|
140
167
|
requirements: []
|
141
|
-
|
142
|
-
rubygems_version: 2.5.1
|
168
|
+
rubygems_version: 3.0.3
|
143
169
|
signing_key:
|
144
170
|
specification_version: 4
|
145
171
|
summary: A simple profiler
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
module Koine
|
4
|
-
class Profiler
|
5
|
-
class Entries
|
6
|
-
extend Forwardable
|
7
|
-
|
8
|
-
def_delegators :storage, :size
|
9
|
-
def_delegators :to_a, :each
|
10
|
-
|
11
|
-
def initialize(groups = [])
|
12
|
-
@storage = Hash.new
|
13
|
-
groups.each { |group| append_group(group) }
|
14
|
-
end
|
15
|
-
|
16
|
-
def append(name, time)
|
17
|
-
group = find_by_name(name) || create_group(name)
|
18
|
-
append_to_group(group, name, time)
|
19
|
-
end
|
20
|
-
|
21
|
-
def find_by_name(name)
|
22
|
-
storage[name.to_s]
|
23
|
-
end
|
24
|
-
|
25
|
-
def elapsed_time
|
26
|
-
storage.inject(0) do |total, (_key, group)|
|
27
|
-
total + group.elapsed_time
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def sort_by(&_block)
|
32
|
-
sorted = storage.sort_by { |item| yield(item[1]) }.map {|_key, group| group }
|
33
|
-
create(sorted)
|
34
|
-
end
|
35
|
-
|
36
|
-
def reverse
|
37
|
-
create(storage.to_a.reverse.map { |_key, group| group })
|
38
|
-
end
|
39
|
-
|
40
|
-
def slowest
|
41
|
-
sort_by(&:elapsed_time).reverse
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_a
|
45
|
-
storage.values
|
46
|
-
end
|
47
|
-
|
48
|
-
def limit(number)
|
49
|
-
create(to_a.slice(0, number.to_i))
|
50
|
-
end
|
51
|
-
|
52
|
-
def ==(other)
|
53
|
-
storage.to_a == other.storage.to_a
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def create(groups = [])
|
59
|
-
self.class.new(groups)
|
60
|
-
end
|
61
|
-
|
62
|
-
def create_group(name)
|
63
|
-
append_group(EntryGroup.new(name))
|
64
|
-
end
|
65
|
-
|
66
|
-
def append_group(group)
|
67
|
-
storage[group.name] = group
|
68
|
-
end
|
69
|
-
|
70
|
-
def append_to_group(group, name, time)
|
71
|
-
group.append(Entry.new(name, time))
|
72
|
-
end
|
73
|
-
|
74
|
-
protected
|
75
|
-
|
76
|
-
attr_reader :storage
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Koine
|
2
|
-
class Profiler
|
3
|
-
class EntryGroup
|
4
|
-
InvalidEntryError = Class.new(StandardError)
|
5
|
-
|
6
|
-
attr_reader :name, :entries
|
7
|
-
|
8
|
-
def initialize(name)
|
9
|
-
@name = name.to_s
|
10
|
-
@entries = []
|
11
|
-
end
|
12
|
-
|
13
|
-
def append(entry)
|
14
|
-
raise InvalidEntryError.new(entry.name) unless entry.name == name
|
15
|
-
|
16
|
-
entries << entry
|
17
|
-
end
|
18
|
-
|
19
|
-
def ==(other)
|
20
|
-
entries == other.entries
|
21
|
-
end
|
22
|
-
|
23
|
-
def <=>(other)
|
24
|
-
elapsed_time <=> other.elapsed_time
|
25
|
-
end
|
26
|
-
|
27
|
-
def elapsed_time
|
28
|
-
entries.inject(0) { |total, entry| entry.elapsed_time + total }
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|