什么是最快的Ruby logger实现?
我想找到Ruby提供的最快的记录器。我的直觉告诉我syslog会在这场比赛中获胜。但我的直觉似乎是错的。Syslog是我测试过的三个记录器中速度最慢的。我使用的是MacBookPro、OSX10.6(雪豹)、Intel Core2 Duo、4GB内存和Ruby 1.8.7,这些都是用MacPorts构建的。我做错什么了吗?或者Ruby的syslog实现就是这么慢?如果你的结果与我的不同,请随意发布。还欢迎您将最喜欢的Ruby logger添加到基准测试中。我的目标是找到可用的最快的记录器。我只对纯性能(吞吐量)感兴趣。这里不关心多目标日志记录等功能什么是最快的Ruby logger实现?,ruby,comparison,benchmarking,logging,syslog,Ruby,Comparison,Benchmarking,Logging,Syslog,我想找到Ruby提供的最快的记录器。我的直觉告诉我syslog会在这场比赛中获胜。但我的直觉似乎是错的。Syslog是我测试过的三个记录器中速度最慢的。我使用的是MacBookPro、OSX10.6(雪豹)、Intel Core2 Duo、4GB内存和Ruby 1.8.7,这些都是用MacPorts构建的。我做错什么了吗?或者Ruby的syslog实现就是这么慢?如果你的结果与我的不同,请随意发布。还欢迎您将最喜欢的Ruby logger添加到基准测试中。我的目标是找到可用的最快的记录器。我只对
# loggers_bench.rb
require 'rbench'
require 'activesupport'
require 'syslog'
require 'logger'
buffered = ActiveSupport::BufferedLogger.new('buffered.log')
logger = Logger.new('logger.log')
syslog = Syslog.open('rb_syslog')
TIMES = 10_000
RBench.run(TIMES) do
column :syslog, :title => 'Syslog'
column :logger, :title => 'Logger'
column :buffered, :title => 'ActiveSuppoort::BufferedLogger'
report '#info' do
syslog {
300.times do |i|
syslog.info "hello #{i}"
end
}
logger {
300.times do |i|
logger.info "#{Time.now} logging_logger[Process.pid]: INFO logging_logger : hello #{i}"
end
}
buffered {
300.times do |i|
buffered.info "#{Time.now} logging_logger[Process.pid]: INFO logging_logger : hello #{i}"
end
}
end
end
# > RUBYOPT=rubygems ruby loggers_bench.rb
# Syslog | Logger | ActiveSuppoort::BufferedLogger|
# -----------------------------------------------------------------
# #info 158.316 | 117.882 | 98.707 |
注意,我只对Syslog使用了更简单的形式:“hello#{I}”(理论上这应该更快,但事实并非如此)。另外,我的Mac的默认系统日志似乎有一个有限的消息配额(500/秒)。在系统日志中不时生成以下消息:
*** process 1962 exceeded 500 log message per second limit - remaining messages this second discarded ***
我猜
BufferedLogger
的名字的第一部分解释了它的速度,而其他两部分我希望在收到消息后立即编写消息
折衷的办法是提高缓冲对象的吞吐量,减少IO负载,避免因存储区中存在未刷新消息的大规模崩溃而导致日志信息丢失
我想知道,为了在不损失所有消息安全性的情况下提高吞吐量,并以增加复杂性为代价,是否有可能将这两种形式结合起来:使用缓冲日志记录有用但不必100.0000%完整的信息(即偶尔的小损失不会造成痛苦)对于出于法律或诊断目的而必须拥有的消息,您可以选择非缓冲消息
如果必须拥有的消息的数量相对较少(应该如此,或者这种方法可能不必要地复杂),那么使用哪种非缓冲记录器就无关紧要了。尝试了syslog ng,结果如下: 次数:50次
用户系统总实际值
SYSLOG 0.0000000.0000000.000000(0.006187)
记录器0.0000000.010000 0.010000(0.003698)
缓冲0.0000000.0000000.000000(0.003069)
bufferred logger似乎更好。好的,我更新了脚本以包含log4r,这是我的首选,因为它支持许多不同的功能。(滚动日志,耶!) 我还在缓冲记录器上添加了一个.flush,减少了测试时间,这样就不用花很长时间。log4r只比缓冲记录器稍微慢一点。那是我的选择
# loggers_bench.rb
require 'rbench'
require 'active_support'
require 'stringio'
buffered = ActiveSupport::BufferedLogger.new('buffered.log')
require 'logger'
logger = Logger.new('logger.log')
require 'syslog'
syslog = Syslog.open('rb_syslog')
require 'log4r'
log4r = Log4r::Logger.new 'mylog'
log4r.outputters = Log4r::FileOutputter.new('log', :filename => 'log4r.log')
TIMES = 5_000
RBench.run(TIMES) do
column :syslog, :title => 'Syslog'
column :logger, :title => 'Logger'
column :buffered, :title => 'ActiveSuppoort::BufferedLogger'
column :log4r, :title => 'log4r'
report '#info' do
syslog {
10.times do |i|
syslog.info "hello #{i}"
end
}
logger {
10.times do |i|
logger.info "#{Time.now} logging_logger[Process.pid]: INFO logging_logger : hello #{i}"
end
}
buffered {
10.times do |i|
buffered.info "#{Time.now} logging_logger[Process.pid]: INFO logging_logger : hello #{i}"
end
buffered.flush
}
log4r {
10.times do |i|
log4r.info "#{Time.now} logging_logger[Process.pid]: INFO logging_logger : hello #{i}"
end
}
end
end
# Syslog | Logger | ActiveSuppoort::BufferedLogger | log4r |
# ----------------------------------------------------------------------------
# #info 2.377 | 2.040 | 1.425 | 1.532 |
您还应该查看日志记录(http://github.com/TwP/logging)框架。有一个基准(https://github.com/TwP/logging/blob/master/test/benchmark.rb)您可以查看该文件,以便与log4r和核心ruby记录器进行比较