Java Language
मानक
खोज…
परिचय
जावा में प्रदर्शन बेंचमार्क लिखना शुरू में और अंत में System.currentTimeMillis()
प्राप्त करना और अंतर की गणना करना उतना सरल नहीं है। वैध प्रदर्शन बेंचमार्क लिखने के लिए, व्यक्ति को उचित उपकरणों का उपयोग करना चाहिए।
सरल JMH उदाहरण
उचित बेंचमार्क टेस्ट लिखने के लिए एक उपकरण JMH है । मान लें कि हम HashSet
बनाम TreeSet
में किसी तत्व को खोजने के प्रदर्शन की तुलना करना चाहते हैं।
JHM को अपनी परियोजना में लाने का सबसे आसान तरीका है - मावेन और शेड प्लगइन का उपयोग करना। इसके अलावा आप JHM उदाहरणों से pom.xml
देख सकते हैं।
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>/benchmarks</finalName>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.openjdk.jmh.Main</mainClass>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.18</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.18</version>
</dependency>
</dependencies>
इसके बाद आपको स्वयं बेंचमार्क क्लास लिखना होगा:
package benchmark;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.TimeUnit;
@State(Scope.Thread)
public class CollectionFinderBenchmarkTest {
private static final int SET_SIZE = 10000;
private Set<String> hashSet;
private Set<String> treeSet;
private String stringToFind = "8888";
@Setup
public void setupCollections() {
hashSet = new HashSet<>(SET_SIZE);
treeSet = new TreeSet<>();
for (int i = 0; i < SET_SIZE; i++) {
final String value = String.valueOf(i);
hashSet.add(value);
treeSet.add(value);
}
stringToFind = String.valueOf(new Random().nextInt(SET_SIZE));
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void testHashSet(Blackhole blackhole) {
blackhole.consume(hashSet.contains(stringToFind));
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void testTreeSet(Blackhole blackhole) {
blackhole.consume(treeSet.contains(stringToFind));
}
}
कृपया इस blackhole.consume()
ध्यान रखें, हम इसे बाद में वापस प्राप्त करेंगे। साथ ही हमें बेंचमार्क चलाने के लिए मुख्य वर्ग की आवश्यकता है:
package benchmark;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
public class BenchmarkMain {
public static void main(String[] args) throws RunnerException {
final Options options = new OptionsBuilder()
.include(CollectionFinderBenchmarkTest.class.getSimpleName())
.forks(1)
.build();
new Runner(options).run();
}
}
और हम सब सेट हैं। हमें बस mvn package
चलाने की जरूरत है (यह आपके /target
फ़ोल्डर में benchmarks.jar
बनाएगा) और हमारे बेंचमार्क टेस्ट को चलाएगा:
java -cp target/benchmarks.jar benchmark.BenchmarkMain
और कुछ वार्मअप और गणना पुनरावृत्तियों के बाद, हमारे परिणाम होंगे:
# Run complete. Total time: 00:01:21
Benchmark Mode Cnt Score Error Units
CollectionFinderBenchmarkTest.testHashSet avgt 20 9.940 ± 0.270 ns/op
CollectionFinderBenchmarkTest.testTreeSet avgt 20 98.858 ± 13.743 ns/op
उस blackhole.consume()
बारे में। यदि आपकी गणना आपके आवेदन की स्थिति को नहीं बदलती है, तो जावा सबसे अधिक संभावना है कि आप इसे अनदेखा करेंगे। तो, इससे बचने के लिए, आप या तो अपने बेंचमार्क तरीकों को कुछ मूल्य वापस कर सकते हैं, या इसका उपभोग करने के लिए Blackhole
ऑब्जेक्ट का उपयोग कर सकते हैं।
आप Aleksey Shipilëv के ब्लॉग में उचित बेंचमार्क लिखने के बारे में अधिक जानकारी याकूब जेनकोव के ब्लॉग और जावा-प्रदर्शन ब्लॉग: 1 , 2 में पा सकते हैं ।