新しいMacBook Proを買ったのでScalaのコンパイラのベンチマークをした

4年以上前に買ったものを買い替えました。計測条件は後で書くとして、雑な結論を先に書いておくと

  • 30%くらい速くなった
  • 相変わらずCPUの1コアあたりのクロック数がボトルネック?(本当にそういう理由なのか、あまり自信ない)
  • CPUのコアを使い切っている感じではなさそうだった。つまり現状ではコア数に比例してスケールはしなそう。
  • 軽く見た限り、JVMのwarm up時にCPU多めに使っている感じで、本当の計測時はそこまで多く使っていなく(?)、CPUのグラフがギザギザだった。
  • メモリを増やしたからといって、それに比例してはやくなったりはしなそう(それほどちゃんと計測してない)。ただ、2GBから12GBくらいに増やしたら、1〜2割速くなった気もする。GCの回数が減った分? (そもそも、メモリ量に 比例して速くなる プログラムの方が圧倒的に少なそう)
  • 少なくとも今回の計測では、SSDの性能も特に影響してなさそう?(新しいほうはNVMeになっている?よくわかってない https://twitter.com/kmizu/status/1020269191494955009 )

というわけで、このあたりから、わかる限りの詳細条件や具体的な結果を記述

計測結果

https://gist.github.com/xuwei-k/94feafabea1db85a3ecd9086561c89d7

新しいPC

[info] Benchmark                                   (corpusPath)  (corpusVersion)  (extraArgs)  (resident)  (scalaVersion)                                                  (source)    Mode  Cnt      Score     Error  Units
[info] HotScalacBenchmark.compile                     ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample   30  23913.125 ± 555.073  ms/op
[info] HotScalacBenchmark.compile:compile·p0.00       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       22783.459            ms/op
[info] HotScalacBenchmark.compile:compile·p0.50       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       23672.652            ms/op
[info] HotScalacBenchmark.compile:compile·p0.90       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       25028.251            ms/op
[info] HotScalacBenchmark.compile:compile·p0.95       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       25231.255            ms/op
[info] HotScalacBenchmark.compile:compile·p0.99       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       25434.259            ms/op
[info] HotScalacBenchmark.compile:compile·p0.999      ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       25434.259            ms/op
[info] HotScalacBenchmark.compile:compile·p0.9999     ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       25434.259            ms/op
[info] HotScalacBenchmark.compile:compile·p1.00       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       25434.259            ms/op

古いPC

[info] Benchmark                                   (corpusPath)  (corpusVersion)  (extraArgs)  (resident)  (scalaVersion)                                                  (source)    Mode  Cnt      Score     Error  Units
[info] HotScalacBenchmark.compile                     ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample   30  34167.360 ± 287.571  ms/op
[info] HotScalacBenchmark.compile:compile·p0.00       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       33252.442            ms/op
[info] HotScalacBenchmark.compile:compile·p0.50       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       34326.184            ms/op
[info] HotScalacBenchmark.compile:compile·p0.90       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       34628.174            ms/op
[info] HotScalacBenchmark.compile:compile·p0.95       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       34695.283            ms/op
[info] HotScalacBenchmark.compile:compile·p0.99       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       34695.283            ms/op
[info] HotScalacBenchmark.compile:compile·p0.999      ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       34695.283            ms/op
[info] HotScalacBenchmark.compile:compile·p0.9999     ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       34695.283            ms/op
[info] HotScalacBenchmark.compile:compile·p1.00       ../corpus           latest                    false          2.12.6  @/Users/kenji/scalaz/scalaz/core/jvm/target/compile.args  sample       34695.283            ms/op

計測条件

共通の条件

計測方法(scala-devのissue 392を簡単に要約するだけ)

  • 上記scala-devのissueにあるpluginを、一時的に計測したいプロジェクト(今回はscalaz)の project/適当なファイル名.scala に書き込む
  • sbt coreJVM/argsFile というコマンドを実行して、ファイル書き出す
  • scala/compiler-benchmark のプロジェクトで sbt を起動し hot -p source=@/ローカルのscalazのプロジェクトのpath/core/jvm/target/compile.args を打ち込むとベンチマーク始まる

新しいPC

f:id:xuwei:20180721110417p:plain

f:id:xuwei:20180721105629p:plain

f:id:xuwei:20180721112617p:plain

$ sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
$ sysctl -a machdep.cpu
machdep.cpu.max_basic: 22
machdep.cpu.max_ext: 2147483656
machdep.cpu.vendor: GenuineIntel
machdep.cpu.brand_string: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
machdep.cpu.family: 6
machdep.cpu.model: 142
machdep.cpu.extmodel: 8
machdep.cpu.extfamily: 0
machdep.cpu.stepping: 10
machdep.cpu.feature_bits: 9221959987971750911
machdep.cpu.leaf7_feature_bits: 43804591
machdep.cpu.extfeature_bits: 1241984796928
machdep.cpu.signature: 526058
machdep.cpu.brand: 0
machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C
machdep.cpu.leaf7_features: SMEP ERMS RDWRFSGS TSC_THREAD_OFFSET BMI1 AVX2 BMI2 INVPCID SMAP RDSEED ADX IPT SGX FPU_CSDS MPX CLFSOPT
machdep.cpu.extfeatures: SYSCALL XD 1GBPAGE EM64T LAHF LZCNT PREFETCHW RDTSCP TSCI
machdep.cpu.logical_per_package: 16
machdep.cpu.cores_per_package: 8
machdep.cpu.microcode_version: 150
machdep.cpu.processor_flag: 6
machdep.cpu.mwait.linesize_min: 64
machdep.cpu.mwait.linesize_max: 64
machdep.cpu.mwait.extensions: 3
machdep.cpu.mwait.sub_Cstates: 286531872
machdep.cpu.thermal.sensor: 1
machdep.cpu.thermal.dynamic_acceleration: 1
machdep.cpu.thermal.invariant_APIC_timer: 1
machdep.cpu.thermal.thresholds: 2
machdep.cpu.thermal.ACNT_MCNT: 1
machdep.cpu.thermal.core_power_limits: 1
machdep.cpu.thermal.fine_grain_clock_mod: 1
machdep.cpu.thermal.package_thermal_intr: 1
machdep.cpu.thermal.hardware_feedback: 0
machdep.cpu.thermal.energy_policy: 1
machdep.cpu.xsave.extended_state: 31 832 1088 0
machdep.cpu.xsave.extended_state1: 15 832 256 0
machdep.cpu.arch_perf.version: 4
machdep.cpu.arch_perf.number: 4
machdep.cpu.arch_perf.width: 48
machdep.cpu.arch_perf.events_number: 7
machdep.cpu.arch_perf.events: 0
machdep.cpu.arch_perf.fixed_number: 3
machdep.cpu.arch_perf.fixed_width: 48
machdep.cpu.cache.linesize: 64
machdep.cpu.cache.L2_associativity: 4
machdep.cpu.cache.size: 256
machdep.cpu.tlb.inst.large: 8
machdep.cpu.tlb.data.small: 64
machdep.cpu.tlb.data.small_level1: 64
machdep.cpu.address_bits.physical: 39
machdep.cpu.address_bits.virtual: 48
machdep.cpu.core_count: 4
machdep.cpu.thread_count: 8
machdep.cpu.tsc_ccc.numerator: 226
machdep.cpu.tsc_ccc.denominator: 2

古いPC

4年前に買ったときもCPUとメモリは、デフォルトよりは多少アップグレードした気もするけど、よく覚えてない

f:id:xuwei:20180721110514p:plain

f:id:xuwei:20180721110824p:plain

f:id:xuwei:20180721112640p:plain

$ sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Intel(R) Core(TM) i7-4558U CPU @ 2.80GHz
$ sysctl -a machdep.cpu
machdep.cpu.max_basic: 13
machdep.cpu.max_ext: 2147483656
machdep.cpu.vendor: GenuineIntel
machdep.cpu.brand_string: Intel(R) Core(TM) i7-4558U CPU @ 2.80GHz
machdep.cpu.family: 6
machdep.cpu.model: 69
machdep.cpu.extmodel: 4
machdep.cpu.extfamily: 0
machdep.cpu.stepping: 1
machdep.cpu.feature_bits: 9221959987971750911
machdep.cpu.leaf7_feature_bits: 10155
machdep.cpu.extfeature_bits: 142473169152
machdep.cpu.signature: 263761
machdep.cpu.brand: 0
machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C
machdep.cpu.leaf7_features: SMEP ERMS RDWRFSGS TSC_THREAD_OFFSET BMI1 AVX2 BMI2 INVPCID FPU_CSDS
machdep.cpu.extfeatures: SYSCALL XD 1GBPAGE EM64T LAHF LZCNT RDTSCP TSCI
machdep.cpu.logical_per_package: 16
machdep.cpu.cores_per_package: 8
machdep.cpu.microcode_version: 36
machdep.cpu.processor_flag: 6
machdep.cpu.mwait.linesize_min: 64
machdep.cpu.mwait.linesize_max: 64
machdep.cpu.mwait.extensions: 3
machdep.cpu.mwait.sub_Cstates: 286531872
machdep.cpu.thermal.sensor: 1
machdep.cpu.thermal.dynamic_acceleration: 1
machdep.cpu.thermal.invariant_APIC_timer: 1
machdep.cpu.thermal.thresholds: 2
machdep.cpu.thermal.ACNT_MCNT: 1
machdep.cpu.thermal.core_power_limits: 1
machdep.cpu.thermal.fine_grain_clock_mod: 1
machdep.cpu.thermal.package_thermal_intr: 1
machdep.cpu.thermal.hardware_feedback: 0
machdep.cpu.thermal.energy_policy: 1
machdep.cpu.xsave.extended_state: 7 832 832 0
machdep.cpu.xsave.extended_state1: 1 0 0 0
machdep.cpu.arch_perf.version: 3
machdep.cpu.arch_perf.number: 4
machdep.cpu.arch_perf.width: 48
machdep.cpu.arch_perf.events_number: 7
machdep.cpu.arch_perf.events: 0
machdep.cpu.arch_perf.fixed_number: 3
machdep.cpu.arch_perf.fixed_width: 48
machdep.cpu.cache.linesize: 64
machdep.cpu.cache.L2_associativity: 8
machdep.cpu.cache.size: 256
machdep.cpu.tlb.inst.large: 8
machdep.cpu.tlb.data.small: 64
machdep.cpu.tlb.data.small_level1: 64
machdep.cpu.tlb.shared: 1024
machdep.cpu.address_bits.physical: 39
machdep.cpu.address_bits.virtual: 48
machdep.cpu.core_count: 2
machdep.cpu.thread_count: 4
machdep.cpu.tsc_ccc.numerator: 0
machdep.cpu.tsc_ccc.denominator: 0

その他、ベンチマーク関係ない新しいMacBook Proにしてみた感想

  • SSDはそれほど使わないので、選択できる範囲での最低の256GB。CPUとメモリは最大
  • 今までのものは2013年モデル(2014年に買った)。今回買ったものと古いものを比べると、厚さも縦横も全部一回り小さくなったみたい(以下に一緒に撮った写真貼っておきました)
  • 慣れの問題なのか、慣れても使いづらいのか?は、もっと使ってみないとわからないが、キーボードが今までに増して、ペラペラ(?)していて使いづらい気がする
  • escキーがない(タッチバーにある)。辛い
  • タッチバー別に欲しくなかったけれど、最新モデルはそれしか無いので
  • 全部USBのtype-cになった。まだそんなに機器を接続する機会ないので、わからないが、これから不便感じるのだろうか
  • 電源部分 MagSafe だと充電中だとオレンジで、100%だったら緑色に光ったけど、USBになってそれがなくなって、接続されているのか充電中なのか、ひと目でわかりにくい気がした
  • 書いてて思ったけど、スペック上がった以外にあまりいいところが見当たらない・・・辛い。けどWindowsは嫌だし、Linux自分で入れて頑張るほど詳しくないというか、こだわりもないので、結局Macになる

f:id:xuwei:20180721114058j:plain f:id:xuwei:20180721114159j:plain