本地运行基准测试

我们有一个简单的流程来运行 SunSpider、Kraken 和 Octane 的“经典”基准测试。您可以使用不同的二进制文件和标志组合运行,结果会根据多次运行进行平均。

CPU #

按照 使用 GN 构建 中的说明构建 d8 shell。

在运行基准测试之前,请确保将 CPU 频率缩放调节器设置为性能模式。

sudo tools/cpu.sh fast

cpu.sh 命令理解以下命令

CSuite #

CSuite 是我们简单的基准测试运行器

test/benchmarks/csuite/csuite.py
(sunspider | kraken | octane)
(baseline | compare)
<path to d8 binary>
[-x "<optional extra d8 command-line flags>"]

首先在 baseline 模式下运行以创建基线,然后在 compare 模式下运行以获取结果。CSuite 默认对 Octane 进行 10 次运行,对 SunSpider 进行 100 次运行,对 Kraken 进行 80 次运行,但您可以使用 -r 选项覆盖这些选项以获得更快的结果。

CSuite 在您运行的目录中创建两个子目录

  1. ./_benchmark_runner_data — 这是来自 N 次运行的缓存输出。
  2. ./_results — 它将结果写入此处的 master 文件。您可以使用不同的名称保存这些
    文件,它们将在比较模式下显示。

在比较模式下,您自然会使用不同的二进制文件,或者至少使用不同的标志。

示例用法 #

假设您构建了两个版本的 d8,并且想要查看 SunSpider 的运行情况。首先,创建基线

$ test/benchmarks/csuite/csuite.py sunspider baseline out.gn/master/d8
Wrote ./_results/master.
Run sunspider again with compare mode to see results.

如建议的那样,再次运行,但这次在 compare 模式下使用不同的二进制文件

$ test/benchmarks/csuite/csuite.py sunspider compare out.gn/x64.release/d8

                               benchmark:    score |   master |      % |
===================================================+==========+========+
                       3d-cube-sunspider:     13.9 S     13.4 S   -3.6 |
                      3d-morph-sunspider:      8.6 S      8.4 S   -2.3 |
                   3d-raytrace-sunspider:     15.1 S     14.9 S   -1.3 |
           access-binary-trees-sunspider:      3.7 S      3.9 S    5.4 |
               access-fannkuch-sunspider:     11.9 S     11.8 S   -0.8 |
                  access-nbody-sunspider:      4.6 S      4.8 S    4.3 |
                 access-nsieve-sunspider:      8.4 S      8.1 S   -3.6 |
      bitops-3bit-bits-in-byte-sunspider:      2.0 |      2.0 |        |
           bitops-bits-in-byte-sunspider:      3.7 S      3.9 S    5.4 |
            bitops-bitwise-and-sunspider:      2.7 S      2.9 S    7.4 |
            bitops-nsieve-bits-sunspider:      5.3 S      5.6 S    5.7 |
         controlflow-recursive-sunspider:      3.8 S      3.6 S   -5.3 |
                    crypto-aes-sunspider:     10.9 S      9.8 S  -10.1 |
                    crypto-md5-sunspider:      7.0 |      7.4 S    5.7 |
                   crypto-sha1-sunspider:      9.2 S      9.0 S   -2.2 |
             date-format-tofte-sunspider:      9.8 S      9.9 S    1.0 |
             date-format-xparb-sunspider:     10.3 S     10.3 S        |
                   math-cordic-sunspider:      6.1 S      6.2 S    1.6 |
             math-partial-sums-sunspider:     20.2 S     20.1 S   -0.5 |
            math-spectral-norm-sunspider:      3.2 S      3.0 S   -6.2 |
                    regexp-dna-sunspider:      7.6 S      7.8 S    2.6 |
                 string-base64-sunspider:     14.2 S     14.0 |   -1.4 |
                  string-fasta-sunspider:     12.8 S     12.6 S   -1.6 |
               string-tagcloud-sunspider:     18.2 S     18.2 S        |
            string-unpack-code-sunspider:     20.0 |     20.1 S    0.5 |
         string-validate-input-sunspider:      9.4 S      9.4 S        |
                               SunSpider:    242.6 S    241.1 S   -0.6 |
---------------------------------------------------+----------+--------+

先前运行的输出被缓存到当前目录(_benchmark_runner_data)中创建的子目录中。聚合结果也被缓存到 _results 目录中。在完成比较步骤后,可以删除这些目录。

另一种情况是,您拥有相同的二进制文件,但想要查看不同标志的结果。您觉得很无聊,想看看 Octane 在没有优化编译器的情况下如何运行。首先是基线

$ test/benchmarks/csuite/csuite.py -r 1 octane baseline out.gn/x64.release/d8

Normally, octane requires 10 runs to get stable results.
Wrote /usr/local/google/home/mvstanton/src/v8/_results/master.
Run octane again with compare mode to see results.

请注意,一次运行通常不足以确定许多性能优化的效果,但是,我们的“更改”应该只用一次运行就能产生可重复的效果!现在让我们进行比较,传递 --noopt 标志以关闭 TurboFan

$ test/benchmarks/csuite/csuite.py -r 1 octane compare out.gn/x64.release/d8 \
-x "--noopt"

Normally, octane requires 10 runs to get stable results.
benchmark: score | master | % |
===================================================+==========+========+
Richards: 973.0 | 26770.0 | -96.4 |
DeltaBlue: 1070.0 | 57245.0 | -98.1 |
Crypto: 923.0 | 32550.0 | -97.2 |
RayTrace: 2896.0 | 75035.0 | -96.1 |
EarleyBoyer: 4363.0 | 42779.0 | -89.8 |
RegExp: 2881.0 | 6611.0 | -56.4 |
Splay: 4241.0 | 19489.0 | -78.2 |
SplayLatency: 14094.0 | 57192.0 | -75.4 |
NavierStokes: 1308.0 | 39208.0 | -96.7 |
PdfJS: 6385.0 | 26645.0 | -76.0 |
Mandreel: 709.0 | 33166.0 | -97.9 |
MandreelLatency: 5407.0 | 97749.0 | -94.5 |
Gameboy: 5440.0 | 54336.0 | -90.0 |
CodeLoad: 25631.0 | 25282.0 | 1.4 |
Box2D: 3288.0 | 67572.0 | -95.1 |
zlib: 59154.0 | 58775.0 | 0.6 |
Typescript: 12700.0 | 23310.0 | -45.5 |
Octane: 4070.0 | 37234.0 | -89.1 |
---------------------------------------------------+----------+--------+

很高兴看到 CodeLoadzlib 几乎没有受到影响。

幕后 #

CSuite 基于同一目录中的两个脚本 benchmark.pycompare-baseline.py。这些脚本中还有更多选项。例如,您可以记录多个基线并进行 3、4 或 5 路比较。CSuite 针对快速使用进行了优化,并牺牲了一些灵活性。