Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance improvement #322

Merged
merged 10 commits into from
Mar 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 61 additions & 2 deletions lib/steep.rb
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ def self.logger
def self.new_logger(output, prev_level)
ActiveSupport::TaggedLogging.new(Logger.new(output)).tap do |logger|
logger.push_tags "Steep #{VERSION}"
logger.level = prev_level || Logger::WARN
logger.level = prev_level || Logger::ERROR
end
end

Expand All @@ -157,7 +157,7 @@ def self.log_output=(output)
@logger = nil
self.log_output = STDERR

def self.measure(message, level: :info)
def self.measure(message, level: :warn)
start = Time.now
yield.tap do
time = Time.now - start
Expand All @@ -174,4 +174,63 @@ def self.log_error(exn, message: "Unexpected error: #{exn.inspect}")
Steep.logger.warn " #{loc}"
end
end

class Sampler
def initialize()
@samples = []
end

def sample(message)
start = Time.now
yield.tap do
time = Time.now - start
@samples << [message, time]
end
end

def count
@samples.count
end

def total
@samples.sum(&:last)
end

def slowests(num)
@samples.sort_by(&:last).reverse.take(num)
end

def average
if count > 0
total/count
else
0
end
end

def percentile(p)
slowests(count - count * p / 100r).last&.last || 0
end
end

def self.measure2(message, level: :warn)
sampler = Sampler.new
result = yield(sampler)

if level.is_a?(Symbol)
level = Logger.const_get(level.to_s.upcase)
end
logger.log(level) { "#{sampler.total}secs for \"#{message}\"" }
logger.log(level) { " Average: #{sampler.average}secs"}
logger.log(level) { " Median: #{sampler.percentile(50)}secs"}
logger.log(level) { " Samples: #{sampler.count}"}
logger.log(level) { " 99 percentile: #{sampler.percentile(99)}secs"}
logger.log(level) { " 90 percentile: #{sampler.percentile(90)}secs"}
logger.log(level) { " 10 Slowests:"}
sampler.slowests(10).each do |message, time|
logger.log(level) { " #{message} (#{time}secs)"}
end

result
end
end
4 changes: 4 additions & 0 deletions lib/steep/ast/types/class.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ def initialize(location: nil)
@location = location
end

def to_s
"class"
end

def ==(other)
other.is_a?(Class)
end
Expand Down
17 changes: 10 additions & 7 deletions lib/steep/drivers/validate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,16 @@ def run
changes = file_loader.load_changes(target.signature_pattern, changes: {})
controller.update(changes)

errors = case controller.status
when Services::SignatureService::SyntaxErrorStatus, Services::SignatureService::AncestorErrorStatus
controller.status.diagnostics
when Services::SignatureService::LoadedStatus
check = Subtyping::Check.new(factory: AST::Types::Factory.new(builder: controller.latest_builder))
Signature::Validator.new(checker: check).tap {|v| v.validate() }.each_error.to_a
end
errors =
Steep.measure "Validation" do
case controller.status
when Services::SignatureService::SyntaxErrorStatus, Services::SignatureService::AncestorErrorStatus
controller.status.diagnostics
when Services::SignatureService::LoadedStatus
check = Subtyping::Check.new(factory: AST::Types::Factory.new(builder: controller.latest_builder))
Signature::Validator.new(checker: check).tap {|v| v.validate() }.each_error.to_a
end
end

any_error ||= !errors.empty?

Expand Down
14 changes: 9 additions & 5 deletions lib/steep/server/change_buffer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,16 @@ def pop_buffer
end

def load_files(project:, commandline_args:)
push_buffer do |changes|
loader = Services::FileLoader.new(base_dir: project.base_dir)
Steep.logger.tagged "#load_files" do
push_buffer do |changes|
loader = Services::FileLoader.new(base_dir: project.base_dir)

project.targets.each do |target|
loader.load_changes(target.source_pattern, commandline_args, changes: changes)
loader.load_changes(target.signature_pattern, changes: changes)
Steep.measure "load changes from disk" do
project.targets.each do |target|
loader.load_changes(target.source_pattern, commandline_args, changes: changes)
loader.load_changes(target.signature_pattern, changes: changes)
end
end
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions lib/steep/server/master.rb
Original file line number Diff line number Diff line change
Expand Up @@ -305,11 +305,11 @@ def process_message_from_worker(message, worker:)
case
when message.key?(:id) && !message.key?(:method)
# Response from worker
Steep.logger.info "Received response #{message[:id]} from worker"
Steep.logger.debug { "Received response #{message[:id]} from worker" }
recon_queue << [message, worker]
when message.key?(:method) && !message.key?(:id)
# Notification from worker
Steep.logger.info "Received notification #{message[:method]} from worker"
Steep.logger.debug { "Received notification #{message[:method]} from worker" }
write_queue << message
end
end
Expand Down
Loading