2014-08-29 7 views
10

मैं अपने कोड पर बेंचमार्क चलाने के लिए जेएमएच बेंचमार्किंग फ्रेमवर्क (http://openjdk.java.net/projects/code-tools/jmh/) का उपयोग कर रहा हूं। मेरी समझ यह है कि जेएमएच निष्पादन के दौरान जेवीएम द्वारा किए गए समय-समय पर (जेआईटी) प्रोफाइलिंग द्वारा बनाई गई किसी भी प्रोफ़ाइल को त्यागने के लिए बेंचमार्किंग के दौरान कई बार JVM को फेंक देता है।जेएमएच अलग फोर्क क्यों चलाता है?

मुझे समझ में क्यों इस तरह के नीचे (http://java-performance.info/jmh/ से शब्दशः नकल की) के रूप में कुछ मामलों में उपयोगी है:

डिफ़ॉल्ट जेएचएम कांटे तक प्रत्येक परीक्षण (पुनरावृत्तियों का सेट) के लिए एक नया जावा प्रक्रिया। पहले एकत्रित "प्रोफ़ाइल" से परीक्षण की रक्षा करने के लिए यह आवश्यक है - अन्य लोड किए गए वर्गों और उनकी निष्पादन जानकारी के बारे में जानकारी। उदाहरण के लिए, यदि आपके पास एक ही इंटरफ़ेस को लागू करने वाले 2 वर्ग हैं और उनमें से दोनों के प्रदर्शन का परीक्षण करते हैं, तो पहला कार्यान्वयन (परीक्षण के क्रम में) दूसरे (एक ही JVM में) से तेज़ होने की संभावना है, क्योंकि जेआईटी प्रतिस्थापन दूसरे कार्यान्वयन की खोज के बाद इंटरफ़ेस विधि कॉल के साथ पहले कार्यान्वयन के लिए प्रत्यक्ष विधि कॉल।

हालांकि, यदि आप उसी कोड को बार-बार बेंचमार्क कर रहे हैं, तो 200 पुनरावृत्तियों के साथ 1 कांटा के बजाय 20 पुनरावृत्तियों के 10 फोर्क कहने का कोई फायदा होता है?

कई धन्यवाद,

डैनी

उत्तर

11

कुछ लोगों का कहना है कि कांटे का उपयोग करके हल किया एक और समस्या को चलाने-टू-रन विचरण कर रहा है: http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_13_RunToRun.java

हालांकि, किसी भी गंभीर इंजीनियर पर्याप्त व्यायाम करने के लिए सक्षम होना चाहिए रनों के बीच किसी भी अंतर को खत्म करने के लिए बेंचमार्किंग पर्यावरण पर नियंत्रण। लोग अपने आलस्य को दूर करने के लिए कांटे का उपयोग करने वाले लोगों को देखने के लिए निराशाजनक हैं या समझने की कमी है कि उनके मानक वास्तव में कैसे निष्पादित किए जाते हैं।

संबंधित मुद्दे