खोज…


परिचय

जावा में प्रदर्शन बेंचमार्क लिखना शुरू में और अंत में 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 में पा सकते हैं



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow