ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Java-ΠΊΠΎΠ΄Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΈΠΊΡΠΎΠ±Π΅Π½ΡΠΌΠ°ΡΠΊΠΎΠ² Π½Π° JMH
Π§ΠΈΡΠ°ΡΡ ΠΎ Java Microbenchmark Harness (JMH) Π·Π΄Π΅ΡΡ -> https://github.com/openjdk/jmh
Π₯ΠΎΡΠΎΡΠ°Ρ Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠ° ΠΏΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ JVM:
-
Π‘ΠΊΠΎΡΡ ΠΡΠΊΡ "ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ Java. Π’ΡΠ½ΠΈΠ½Π³ ΠΊΠΎΠ΄Π° Π½Π° Java 8, 11 ΠΈ Π΄Π°Π»ΡΡΠ΅"
-
ΠΠ²Π°Π½Ρ, ΠΠΎΡ, ΠΡΡΠ»Π°Π½Π΄ "Java. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² JVM"
ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅:
mvn clean install
java -jar target/benchmarks.jar [ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ°]Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠΎΠ² JMH ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΡΠΎΠ»Π±ΡΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π°ΠΆΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
- Benchmark: ΠΡΠΎ ΠΈΠΌΡ ΡΠ΅ΡΡΠ°. Π Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, FactorialBenchmark.loopFactorial ΠΈ FactorialBenchmark.recursiveFactorial ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° Π΄Π²Π° ΡΠ°Π·Π½ΡΡ Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ°: ΠΎΠ΄ΠΈΠ½ Ρ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π°, Π° Π΄ΡΡΠ³ΠΎΠΉ Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠΉ.
(n): ΠΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ Π² Π±Π΅Π½ΡΠΌΠ°ΡΠΊ. Π Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ n Π΄Π»Ρ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π°. ΠΠ½Π°ΡΠ΅Π½ΠΈΡ 10 ΠΈ 20 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΡΡΠΎ Π±Π΅Π½ΡΠΌΠ°ΡΠΊ Π±ΡΠ» Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π΄Π»Ρ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»ΠΎΠ² ΡΡΠΈΡ ΡΠΈΡΠ΅Π».
Mode: Π Π΅ΠΆΠΈΠΌ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ Π±Π΅Π½ΡΠΌΠ°ΡΠΊ. thrpt ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ "throughput", Ρ.Π΅. ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ. ΠΡΠΎ ΠΌΠ΅ΡΠ° ΡΠΎΠ³ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ Π±ΡΠ»ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ (ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ).
Cnt: ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ (measurements) Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ.
Score: Π‘ΡΠ΅Π΄Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ. ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΎΠ½ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΌΠ΅ΡΠΎΠ΄ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π·Π° ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ loopFactorial Ρ n = 10 Π²Π°Ρ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 236 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΡΠ°Π· Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
Error: ΠΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅) ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ. ΠΠ½Π° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ°Π±ΠΈΠ»ΡΠ½Ρ Π±ΡΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ°. ΠΠ΅Π½ΡΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ.
Units: ΠΠ΄ΠΈΠ½ΠΈΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Score. Π Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠΎ ops/s, ΡΠΎ Π΅ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΡ Π Π΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ²
ΠΡΠΎΠΏΡΡΠΊΠ½Π°Ρ Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ: Π§Π΅ΠΌ Π²ΡΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΡΡΠΎΠ»Π±ΡΠ΅ Score, ΡΠ΅ΠΌ Π»ΡΡΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°. Π Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ (loopFactorial) ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ Π±ΡΡΡΡΠ΅Π΅ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠΉ (recursiveFactorial) Π΄Π»Ρ ΠΎΠ±ΠΎΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ n.
Π‘ΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ: ΠΠ΅Π½ΡΡΠ°Ρ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ (Error) ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΡ ΠΈ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ.
ΠΠ»ΠΈΡΠ½ΠΈΠ΅ Π Π°Π·ΠΌΠ΅ΡΠ° ΠΠ°Π΄Π°ΡΠΈ: ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΠΎΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠ½ΠΈΠΆΠ°Π΅ΡΡΡ Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ n. ΠΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π±ΠΎΠ»ΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ n ΡΡΠ΅Π±ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π°.
ΠΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π²Π»ΠΈΡΡΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π² Java.