fiddlesticks 0.1.0 → 0.2.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
  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: {}