fiddlesticks 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1cbd9cdeeef5937f37d6670e4dd0e37fc6c88805
4
- data.tar.gz: 94edd386365c99ae373dc1b4e1e43a2a02764a99
3
+ metadata.gz: 40b1caf285de1c64e0b825ef56e639243df97315
4
+ data.tar.gz: 6a9b3bbaaaaa9535fc061aed902a5465416e1799
5
5
  SHA512:
6
- metadata.gz: 0b9113ea6d453abfefe2a2e37acef74474f7bab576f506e05158ba6b14812a8935230e862e23a8ad1509d32612f31049dd19438e951fbe7ab3c6c53c1e0fe1d1
7
- data.tar.gz: ce15bc2e4b0674f265ba67912d2ea2f60291514211c8fd8698ad5266c330d7016b903f65f2424a4ef7017097ec968a9b3861b75ab094f2bd0f8116dcb50e6444
6
+ metadata.gz: 7041642fbaea7929c055fdd6f197ec2d4490f3138a47189e189f01a1706ebeb4a261b2e46472c0bf666d19dca593766a69787c4cc3bf0276b1bac166519c85d6
7
+ data.tar.gz: ba974eff589d9037db4c35a4f4f46b71541e50ee717c6be76d226c844463956a2b5d667d3ad1a170458ed9fa094f4fb3d0a48af20a7eea73866ea5f737841946
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Björn Grunde
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,49 @@
1
+ # fiddlesticks
2
+
3
+ Simple wrapper to measure optimization or to find bottlenecks in your codebase.
4
+
5
+ As for now:
6
+ Works on Mac.
7
+ Not yet tested in Linux distributions.
8
+ Not yet implemented support for Windows.
9
+
10
+ Install
11
+ ```
12
+ gem install fiddlesticks
13
+ ```
14
+ Use
15
+ ```
16
+ optimize = Fiddlesticks::Core.new
17
+
18
+ optimize.measure do
19
+ 100000.times do
20
+ "SOME STRING".downcase
21
+ end
22
+ end
23
+ ```
24
+ The ***measure*** method will accept a block and print a table with usefull information that may help when optimizing your code.
25
+
26
+ ```
27
+ +--------------+---------+-----------+--------------+-------------+--------------+
28
+ | Ruby Version | GC | GC Sweeps | Total Memory | Memory Used | Time |
29
+ +--------------+---------+-----------+--------------+-------------+--------------+
30
+ | 2.4.0 | enabled | 32 | 16.00 GB | 1936.08 MB | 1.37 Seconds |
31
+ +--------------+---------+-----------+--------------+-------------+--------------+
32
+
33
+ ```
34
+
35
+ If you want to print out memory in different formats user ***configure*** method. It accepts a Hash with the keys:
36
+ 1. total_memory: [Symbol] format: ':kb', ':mb', ':gb', standard ':gb'
37
+ 2. used_memory: [Symbol] format: ':kb', ':mb', ':gb', standard ':mb'
38
+ 3. gc_enabled: [Boolean] format: 'true, 'false', standard 'true'
39
+
40
+ ```
41
+ optimize = Fiddlesticks::Core.new
42
+
43
+ optimize.configure({total_memory: :mb, used_memory: :kb, gc_enabled: false })
44
+
45
+ optimize.measure do
46
+ #run a block of code
47
+ end
48
+ ```
49
+ Will support Mac, Linux and Windows once the project is completed.
@@ -1,46 +1 @@
1
- require "benchmark"
2
- require "color-console"
3
- require "fiddlesticks/os"
4
-
5
- class Fiddlesticks
6
-
7
- def measure(&block)
8
- no_gc = (ARGV[0] == "--no-gc")
9
- no_gc ? GC.disable : GC.start
10
-
11
- memory_before = `ps -o rss= -p #{Process.pid}`.to_i/1024
12
- gc_stat_before = GC.stat
13
-
14
- time = Benchmark.realtime do
15
- yield
16
- end
17
-
18
- unless no_gc
19
- GC.start(full_mark: true, immediate_sweep: true, immediate_mark: false)
20
- end
21
-
22
- gc_stat_after = GC.stat
23
- memory_after = `ps -o rss= -p #{Process.pid}`.to_i/1024
24
-
25
- if OS.windows?
26
- total_memory = "Support coming soon"
27
- elsif OS.mac?
28
- total_memory = "%d GB" % (`sysctl hw.memsize`.split(" ").last.to_i/1024/1024/1000)
29
- elsif OS.linux?
30
- total_memory = %x(free).split(" ")[7].to_i/1024
31
- else
32
- total_memory = "OS Not Found!"
33
- end
34
-
35
- memory_used = "%d MB" % (memory_after - memory_before)
36
-
37
- gc = no_gc ? "disabled" : "enabled"
38
- gc_count = gc_stat_after[:count] - gc_stat_before[:count]
39
-
40
-
41
- header = ["Ruby Version", "GC", "GC Sweeps", "Total Memory", "Memory Used", "Time"]
42
- data = [ RUBY_VERSION, gc, gc_count, total_memory, memory_used, time.round(2)]
43
-
44
- Console.display_table([header, data], width: 100, col_sep: "|", row_sep: "-")
45
- end
46
- end
1
+ require 'fiddlesticks/core.rb'
@@ -0,0 +1,65 @@
1
+ require "benchmark"
2
+ require "color-console"
3
+ require "fiddlesticks/os"
4
+ require "fiddlesticks/memory"
5
+
6
+ # Fiddlesticks runs a block of code and measures memory usage and execution time.
7
+ # @author Björn Grunde
8
+ module Fiddlesticks
9
+ class Core
10
+ include OS
11
+ include Memory
12
+
13
+
14
+ def initialize(total_memory: :gb, used_memory: :mb, gc_enabled: true)
15
+ @config = {
16
+ total_memory: total_memory,
17
+ used_memory: used_memory,
18
+ gc_enabled: gc_enabled
19
+ }
20
+ @valid_keys = @config.keys
21
+ end
22
+
23
+ def configure(opt = {})
24
+ #@params opt [Hash]
25
+ #@description Accepts a [Hash] with the keys:
26
+ # total_memory [Symbol] format type ':kb', ':mb', 'gb' standard: ':gb',
27
+ # used_memory [Symbol] format type ':kb', ':mb', 'gb' standard: ':mb',
28
+ # gc_enabled [Boolean] format type 'true', 'false' standard: 'true'
29
+ opt.each { |k, v| @config[k.to_sym] = v if @valid_keys.include? k.to_sym }
30
+ end
31
+
32
+ def measure(&block)
33
+ total_memory_type = @config.fetch(:total_memory)
34
+ used_memory_type = @config.fetch(:used_memory)
35
+ gc_enabled = @config.fetch(:gc_enabled)
36
+
37
+ gc_enabled ? GC.start : GC.disable
38
+ memory_before = get_memory(used_memory_type)
39
+ gc_stat_before = GC.stat
40
+
41
+ time = Benchmark.realtime do
42
+ yield
43
+ end
44
+
45
+ if gc_enabled
46
+ GC.start(full_mark: true, immediate_sweep: true, immediate_mark: false)
47
+ end
48
+
49
+ gc_stat_after = GC.stat
50
+ memory_after = get_memory(used_memory_type)
51
+ memory_total = total_memory(total_memory_type)
52
+ memory_used = calculate_memory(memory_before, memory_after, used_memory_type)
53
+
54
+ gc = gc_enabled ? "enabled" : "disabled"
55
+
56
+ gc_count = gc_stat_after[:count] - gc_stat_before[:count]
57
+
58
+
59
+ header = ["Ruby Version", "GC", "GC Sweeps", "Total Memory", "Memory Used", "Time"]
60
+ data = [ RUBY_VERSION, gc, gc_count, memory_total, memory_used, "#{time.round(2)} Seconds"]
61
+
62
+ Console.display_table([header, data], width: 100, col_sep: "|", row_sep: "-")
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,56 @@
1
+ module Fiddlesticks
2
+ module Memory
3
+
4
+ def get_memory type
5
+ type.to_sym
6
+ memory = `ps -o rss= -p #{Process.pid}`.to_f
7
+
8
+ case type
9
+ when :mb then memory = memory/1024
10
+ when :gb then memory = memory/1024/1024
11
+ when :kb then memory
12
+ end
13
+
14
+ return memory if [:kb, :mb, :gb].include?(type)
15
+ raise ArgumentError.new("Argument is not of type Symbol, expected one of(:kb, :mb, :gb)")
16
+ end
17
+
18
+ def total_memory type
19
+ type.to_sym
20
+ os = ""
21
+
22
+ if OS.windows?
23
+ total_memory = ""
24
+ os = "Windows"
25
+ elsif OS.mac?
26
+ total_memory = `sysctl hw.memsize`.split(" ").last.to_i
27
+ os = "Mac"
28
+ elsif OS.linux?
29
+ total_memory = %x(free).split(" ")[7].to_i
30
+ os = "Linux"
31
+ else
32
+ total_memory = ""
33
+ os = "Unkown OS"
34
+ end
35
+
36
+ case type
37
+ when :kb then total_memory
38
+ when :mb then total_memory = total_memory/1024
39
+ when :gb then total_memory = total_memory/1024/1024/1000
40
+ end
41
+
42
+ return "%.2f #{type.upcase}" % total_memory if [:kb, :mb, :gb].include?(type) && total_memory.is_a?(Integer)
43
+
44
+ raise ArgumentError.new("Argument is not of type Symbol, expected one of(:kb, :mb, :gb)")
45
+ raise NotImplementedError.new("Fiddlesticks either lack support or could not figure out the os: #{os}") if ["Windows", "Unkown OS"].include?(os)
46
+ end
47
+
48
+ def calculate_memory before, after, type
49
+ before.to_f && after.to_f && type.to_sym
50
+
51
+ memory_used = after - before
52
+ return memory_used = "%g #{type.upcase}" % ("%.4f" % memory_used) unless memory_used == 0
53
+ "Less than 1 MB"
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fiddlesticks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Björn Grunde
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-16 00:00:00.000000000 Z
11
+ date: 2017-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: color-console
@@ -29,11 +29,17 @@ description: Fiddlesticks accepts a block of code and willl show the memory used
29
29
  email: bjorngrunde@live.se
30
30
  executables: []
31
31
  extensions: []
32
- extra_rdoc_files: []
32
+ extra_rdoc_files:
33
+ - README.md
34
+ - LICENSE
33
35
  files:
36
+ - LICENSE
37
+ - README.md
34
38
  - lib/fiddlesticks.rb
39
+ - lib/fiddlesticks/core.rb
40
+ - lib/fiddlesticks/memory.rb
35
41
  - lib/fiddlesticks/os.rb
36
- homepage:
42
+ homepage: https://github.com/bjorngrunde/fiddlesticks
37
43
  licenses:
38
44
  - MIT
39
45
  metadata: {}