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公式の scala/compiler-benchmark という jmh のプロジェクトを使用 Gather real-world feedback about 2.12.3 performance · Issue #392 · scala/scala-dev · GitHub 計測時点での最新のtree https://github.com/scala/compiler-benchmark/tree/62fbcf6f3715d
- Scalaは2.12.6
- Xmxなどのオプションはデフォルトのまま(2GByte)
- 計測に使ったのは計測時点での最新のscalaz 7.3 https://github.com/scalaz/scalaz/tree/e1198dfbbf8 の、coreのjvmのプロジェクトのみ
計測方法(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
$ 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とメモリは、デフォルトよりは多少アップグレードした気もするけど、よく覚えてない
$ 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になる