Profile various stages of a site's build process (#6760)
Merge pull request 6760
This commit is contained in:
parent
5649cac7e7
commit
589b122416
|
@ -139,6 +139,7 @@ Style/FormatStringToken:
|
||||||
Exclude:
|
Exclude:
|
||||||
- lib/jekyll/utils/ansi.rb
|
- lib/jekyll/utils/ansi.rb
|
||||||
- lib/jekyll/liquid_renderer/table.rb
|
- lib/jekyll/liquid_renderer/table.rb
|
||||||
|
- lib/jekyll/profiler.rb
|
||||||
Style/FrozenStringLiteralComment:
|
Style/FrozenStringLiteralComment:
|
||||||
EnforcedStyle: always
|
EnforcedStyle: always
|
||||||
Style/GuardClause:
|
Style/GuardClause:
|
||||||
|
|
|
@ -69,6 +69,7 @@ module Jekyll
|
||||||
autoload :PathManager, "jekyll/path_manager"
|
autoload :PathManager, "jekyll/path_manager"
|
||||||
autoload :PluginManager, "jekyll/plugin_manager"
|
autoload :PluginManager, "jekyll/plugin_manager"
|
||||||
autoload :Publisher, "jekyll/publisher"
|
autoload :Publisher, "jekyll/publisher"
|
||||||
|
autoload :Profiler, "jekyll/profiler"
|
||||||
autoload :Reader, "jekyll/reader"
|
autoload :Reader, "jekyll/reader"
|
||||||
autoload :Regenerator, "jekyll/regenerator"
|
autoload :Regenerator, "jekyll/regenerator"
|
||||||
autoload :RelatedPosts, "jekyll/related_posts"
|
autoload :RelatedPosts, "jekyll/related_posts"
|
||||||
|
|
|
@ -10,31 +10,11 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_s(num_of_rows = 50)
|
def to_s(num_of_rows = 50)
|
||||||
tabulate(data_for_table(num_of_rows))
|
Jekyll::Profiler.tabulate(data_for_table(num_of_rows))
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def tabulate(data)
|
|
||||||
require "terminal-table"
|
|
||||||
|
|
||||||
header = data.shift
|
|
||||||
footer = data.pop
|
|
||||||
output = +"\n"
|
|
||||||
|
|
||||||
table = Terminal::Table.new do |t|
|
|
||||||
t << header
|
|
||||||
t << :separator
|
|
||||||
data.each { |row| t << row }
|
|
||||||
t << :separator
|
|
||||||
t << footer
|
|
||||||
t.style = { :alignment => :right, :border_top => false, :border_bottom => false }
|
|
||||||
t.align_column(0, :left)
|
|
||||||
end
|
|
||||||
|
|
||||||
output << table.to_s << "\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
# rubocop:disable Metrics/AbcSize
|
# rubocop:disable Metrics/AbcSize
|
||||||
def data_for_table(num_of_rows)
|
def data_for_table(num_of_rows)
|
||||||
sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] }
|
sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] }
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Jekyll
|
||||||
|
class Profiler
|
||||||
|
TERMINAL_TABLE_STYLES = {
|
||||||
|
:alignment => :right,
|
||||||
|
:border_top => false,
|
||||||
|
:border_bottom => false,
|
||||||
|
}.freeze
|
||||||
|
private_constant :TERMINAL_TABLE_STYLES
|
||||||
|
|
||||||
|
def self.tabulate(table_rows)
|
||||||
|
require "terminal-table"
|
||||||
|
|
||||||
|
rows = table_rows.dup
|
||||||
|
header = rows.shift
|
||||||
|
footer = rows.pop
|
||||||
|
output = +"\n"
|
||||||
|
|
||||||
|
table = Terminal::Table.new do |t|
|
||||||
|
t << header
|
||||||
|
t << :separator
|
||||||
|
rows.each { |row| t << row }
|
||||||
|
t << :separator
|
||||||
|
t << footer
|
||||||
|
t.style = TERMINAL_TABLE_STYLES
|
||||||
|
t.align_column(0, :left)
|
||||||
|
end
|
||||||
|
|
||||||
|
output << table.to_s << "\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(site)
|
||||||
|
@site = site
|
||||||
|
end
|
||||||
|
|
||||||
|
def profile_process
|
||||||
|
profile_data = { "PHASE" => "TIME" }
|
||||||
|
total_time = 0
|
||||||
|
|
||||||
|
[:reset, :read, :generate, :render, :cleanup, :write].each do |method|
|
||||||
|
start_time = Time.now
|
||||||
|
@site.send(method)
|
||||||
|
end_time = (Time.now - start_time).round(4)
|
||||||
|
profile_data[method.to_s.upcase] = format("%.4f", end_time)
|
||||||
|
total_time += end_time
|
||||||
|
end
|
||||||
|
|
||||||
|
profile_data["TOTAL TIME"] = format("%.4f", total_time)
|
||||||
|
|
||||||
|
Jekyll.logger.info "\nBuild Process Summary:"
|
||||||
|
Jekyll.logger.info Profiler.tabulate(Array(profile_data))
|
||||||
|
|
||||||
|
Jekyll.logger.info "\nSite Render Stats:"
|
||||||
|
@site.print_stats
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,7 +10,7 @@ module Jekyll
|
||||||
:gems, :plugin_manager, :theme
|
:gems, :plugin_manager, :theme
|
||||||
|
|
||||||
attr_accessor :converters, :generators, :reader
|
attr_accessor :converters, :generators, :reader
|
||||||
attr_reader :regenerator, :liquid_renderer, :includes_load_paths, :filter_cache
|
attr_reader :regenerator, :liquid_renderer, :includes_load_paths, :filter_cache, :profiler
|
||||||
|
|
||||||
# Public: Initialize a new Site.
|
# Public: Initialize a new Site.
|
||||||
#
|
#
|
||||||
|
@ -26,6 +26,7 @@ module Jekyll
|
||||||
@filter_cache = {}
|
@filter_cache = {}
|
||||||
|
|
||||||
@reader = Reader.new(self)
|
@reader = Reader.new(self)
|
||||||
|
@profiler = Profiler.new(self)
|
||||||
@regenerator = Regenerator.new(self)
|
@regenerator = Regenerator.new(self)
|
||||||
@liquid_renderer = LiquidRenderer.new(self)
|
@liquid_renderer = LiquidRenderer.new(self)
|
||||||
|
|
||||||
|
@ -71,13 +72,14 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def process
|
def process
|
||||||
|
return profiler.profile_process if config["profile"]
|
||||||
|
|
||||||
reset
|
reset
|
||||||
read
|
read
|
||||||
generate
|
generate
|
||||||
render
|
render
|
||||||
cleanup
|
cleanup
|
||||||
write
|
write
|
||||||
print_stats if config["profile"]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def print_stats
|
def print_stats
|
||||||
|
|
Loading…
Reference in New Issue