标 准方差会让我们低估总体的实际标准方差。下面是样本标准方差的 Ruby 代码,从现在起我们将使用它。 module Enumerable def stdev Math.sqrt( map{|x| (x - mean) ** 2}.sum / (length-1) ) end end 标准方差对于得到一个数据集中大量变量的整体印象很有用。可以看到上面的两个样本中,第二个比第一个有更大的 标准方差。 samples1.stdev # => 1.09 samples2.stdev # => 6.7954232964384 标准方差与样本数据的单位相同。如果原始数据以毫秒为单位,则上面的两个样本的标准方差分别为 1.1ms 和 6.8ms。 可以用标准方差来估计出一个置信区间。置信区间和平均值能很好地表现出数据的局限性。假定数据正态分布,可使 用如下规则: * 大约 68%的数据分布在距离平均值一个标准方差的范围内 * 95%的数据在距离平均值两个标准方差范围内 * 99.7%的数据在距离平均值三个标准方差范围内 运用第二个规则,我们将从统计数据中生成一个 95%的置信区间。以下 Ruby 代码使用平均值和标准方差来计算该 区间: module Enumerable def confidence_interval (mean - 2*stdev) .. (mean + 2*stdev) end end samples1.confidence_interval # => 7.92941515120981..12.4705848487902 samples2.confidence_interval # => -3.39084659287681..23.7908465928768 可以看出,产生第一个样本的服务器响应时间通常在 8-12ms 间,而第二个服务器时间范围太大以至于没有什么价 值。 比较两组数据时,不光要比较平均值,还要比较标准方差和置信区间。有可能做了一些改进,但置信区间几乎完全重 叠,这就没多大统计意义了。 6.1.1.2 使用 h
ttperf 进行黑盒分析 现 在我们已经知道怎样分析测试结果,可以对网站进行基准测试了。最好的参考是 Zed Shaw 使用 httperf 对 Mongrel 进行调优的介绍(http: //mongrel.rubyforge.org/docs/how_many_mongrels.html)。在此不再重复 该过程,但还是要指出几个注 意事项: * 确保有一个前端服务器(如 apache,lighttpd,或者 nginx)来处理静态文件。然后以向前端服务器请求一个 静态文件为度量基线。Rails 绝不应该比它还快。 * 在离服务器尽可能近(
网络意义上的近)的服务器上运行测试。这有助于消除延时对测试结果的影响。 * 不要在
web 服务器上运行测试。服务器与分析程序之间有太多的相互影响,会使结果混淆不清。即使不需要争 抢 CPU(比如在多处理器机器上),你也无法确定 I/O 竞争是否会扭曲结果。 6.1.2 代码计时 Ruby 标准库包含 Benchmark,可用它来对代码性能作一些简单测量。这里的关键词是简单:它太容易忽略令人迷惑 的因素,不应该把它的结果当成福音。 假定我们想比较常规方法分派和使用 method_missing 检查方法名分派的区别。以下是对这两种选择作的一个简单 的基准测试: require 'benchmark'
class Test def test_one 1+1 end def method_missing(method_id) case method_id when :test_unknown: 1 + 1 else super end end end t = Test.new Benchmark.bmbm do |b| b.report("Direct method call") do 1_000_000.times { t.test_one } end b.report("method_missing") do 1_000_000.times { t.test_unknown } end end 请 注意,我们没有对普通方法分派和直接调用 method_missing 的原始速度作比较。我们比较的是一个普通方法调 用和使用 method_missing 这种标准的 Ruby 实践来响应一个方法名。这给出了一个与我们的问题接近的答案:在这 个特殊的代码片断中 method_
missing 对性能有多大影响? 我们使用 Benchmark.bmbm 方法,它会先运行一次基准套件(预演)来最小化启动消耗,给要测量的代码一个”热 启动“。为让结果尽量精确,每组运行 100 万次调用。 Benchmark 库在每次运行前进行垃圾回收,因为测量过程中的垃圾回收会影响结果。以下是 benchmark 在我机器