qprof 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/lib/qprof/version.rb +5 -0
  3. data/lib/qprof.rb +36 -0
  4. data/qprof.gemspec +22 -0
  5. metadata +115 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: eba13a9e8805624a466be10b5946b5950027b7286ccbfca3a1fab8c2404d4d69
4
+ data.tar.gz: 7d8f976ac93bf6b6eacf2a3704be13bb99023c86f1da32777dfb5feb0d509cad
5
+ SHA512:
6
+ metadata.gz: de01a49071899ffa76a4382122b79bcfec6d5fe47610079dc69060247cf6ff8dee222382992ca56900694dbe054f141e812a1bf56ed052e3e55a43960804fd65
7
+ data.tar.gz: d5b92d65c04f3ffbb1f7791928e0714cb3de2ce29eeb4cc79dd76e70c4af2d0aaa36e34cf5d5e54a2a2373ec759e3346bf356ff2f00a296b3afc7c40895ae022
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QProf
4
+ VERSION = '1.0.0'
5
+ end
data/lib/qprof.rb ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'benchmark'
5
+
6
+ require 'ruby-prof'
7
+ require 'ruby-prof-flamegraph'
8
+ require 'launchy'
9
+
10
+ module QProf
11
+ class << self
12
+ def call(title = 'Flame Graph')
13
+ FileUtils.mkdir_p('/tmp/qprof')
14
+ run = "#{Time.now.to_i}-#{SecureRandom.hex(4)}"
15
+ run_txt_path = "/tmp/qprof/#{run}.txt"
16
+ run_svg_path = "/tmp/qprof/#{run}.svg"
17
+ flamegraph_pl_path = '/tmp/qprof/FlameGraph/flamegraph.pl'
18
+
19
+ `git clone https://github.com/brendangregg/FlameGraph.git #{File.dirname(flamegraph_pl_path)}` unless File.exist?(flamegraph_pl_path)
20
+
21
+ result = RubyProf.profile do
22
+ @benchmark = Benchmark.measure do
23
+ yield
24
+ end
25
+ end
26
+
27
+ subtitle = %i[utime stime real]
28
+ .map { |x| "#{x} = #{@benchmark.send(x).round(4)}s" }
29
+ .join('; ')
30
+ printer = RubyProf::FlameGraphPrinter.new(result)
31
+ File.open(run_txt_path, 'w') { |file| printer.print(file) }
32
+ `cat #{run_txt_path} | #{flamegraph_pl_path} --title \"#{title}\" --subtitle \"#{subtitle}\" > #{run_svg_path}`
33
+ Launchy.open(run_svg_path)
34
+ end
35
+ end
36
+ end
data/qprof.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/qprof/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'qprof'
7
+ spec.version = QProf::VERSION
8
+ spec.platform = Gem::Platform::RUBY
9
+ spec.author = 'graham otte'
10
+ spec.email = 'go@grahamotte.com'
11
+ spec.description = 'quick and dirty ruby flamegraphs'
12
+ spec.summary = spec.description
13
+ spec.homepage = 'https://github.com/grahamotte/qprof'
14
+ spec.license = 'MIT'
15
+ spec.files = Dir['**/*'].select { |f| f[%r{^(lib/|.*gemspec)}] }
16
+ spec.require_paths = ['lib']
17
+ spec.add_dependency('securerandom')
18
+ spec.add_dependency('benchmark')
19
+ spec.add_dependency('ruby-prof')
20
+ spec.add_dependency('ruby-prof-flamegraph')
21
+ spec.add_dependency('launchy')
22
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qprof
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - graham otte
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: securerandom
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: benchmark
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'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ruby-prof
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby-prof-flamegraph
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: launchy
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: quick and dirty ruby flamegraphs
84
+ email: go@grahamotte.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - lib/qprof.rb
90
+ - lib/qprof/version.rb
91
+ - qprof.gemspec
92
+ homepage: https://github.com/grahamotte/qprof
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubygems_version: 3.2.3
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: quick and dirty ruby flamegraphs
115
+ test_files: []