मैं कुछ सिंगल-थ्रेडेड विधि आमंत्रण (स्कैला में लिखा गया) माप रहा हूं और बेंचमार्क का विश्लेषण करना चाहता हूं। यहां बताया गया है कि यह कैसा दिखता है (कार्यान्वयन विवरण छोड़े गए)

@State(Scope.Benchmark)
class TheBenchmarks {

    var data: Array[Byte] = _
    @Param(Array("1024", "2048", "4096", "8192"))
    var chunkSize: Int = _

    @Setup
    def setup(): Unit = {
        data = //get the data
    }

    @Benchmark
    @OutputTimeUnit(TimeUnit.MICROSECONDS)
    @BenchmarkMode(Array(Mode.AverageTime))
    def takeFirstAvroRecord(bh: Blackhole): Unit = {
      val fr = //do computation with data and chunk size
      bh.consume(fr)
    }

}

ठीक है, मुझे कुछ परिणाम मिला और मैं इसे समझना चाहता था, लेकिन -prof perfasm का आउटपुट मेरे लिए थोड़ा अस्पष्ट है। सबसे पहले:

....[Hottest Regions]...............................................................................
 44.20%   40.50%        runtime stub  StubRoutines::jbyte_disjoint_arraycopy (205 bytes) 
  6.78%    1.62%         C2, level 4  cats.data.IndexedStateT$$Lambda$21::apply, version 1242 (967 bytes) 
  4.39%    0.79%         C2, level 4  my.pack.age.Mclass::cut0, version 1323 (299 bytes) 

तथा

....[Hottest Methods (after inlining)]..............................................................
 44.20%   40.50%        runtime stub  StubRoutines::jbyte_disjoint_arraycopy 
  8.40%    3.93%         C2, level 4  cats.data.IndexedStateT$$Lambda$21::apply, version 1242 
  5.76%    2.67%         C2, level 4  my.pack.age.Mclass::cut0, version 1323 

मुझे jbyte_disjoint_arraycopy के बारे में कुछ पता चला। इसे निम्नानुसार घोषित किया गया है यहां निम्नानुसार है।

StubRoutines::_jbyte_disjoint_arraycopy  = generate_disjoint_byte_copy(false, &entry,
                                                                           "jbyte_disjoint_arraycopy");

generate_disjoint_byte_copy विधि के स्रोत के आधार पर यह एक असेंबली कोड जनरेशन चीज़ की तरह दिखता है ... मैं अनुमान लगा सकता हूं कि यह x86 के लिए कुछ आंतरिक सरणी प्रति है ...

प्रश्न: क्या आप कृपया StubRoutines के बारे में कुछ स्पष्टीकरण दे सकते हैं और इसके सबसे गर्म क्षेत्र के क्या कारण हो सकते हैं?

0
St.Antario 13 सितंबर 2018, 20:03

2 जवाब

सबसे बढ़िया उत्तर

आपने सही अनुमान लगाया। <type>_disjoint_arraycopy स्टब्स रन टाइम में विशेष रूप से System.arraycopy कॉल को तेज करने के लिए जेनरेट किए गए फ़ंक्शन हैं।

जब JVM प्रारंभ होता है, तो यह वर्तमान में उपलब्ध CPU विशेषताएं। उदा. यदि CPU AVX2 का समर्थन करता है, तो उत्पन्न arraycopy स्टब्स AVX2 निर्देशों का उपयोग करें

System.arraycopy हॉटस्पॉट आंतरिक विधि है। जब C2 द्वारा संकलित किया जाता है, तो System.arraycopy का आह्वान आवश्यक जांच करता है और फिर उत्पन्न arraycopy स्टब रूटीन में से एक को कॉल करता है।

यदि StubRoutines::jbyte_disjoint_arraycopy सबसे गर्म क्षेत्र है, तो इसका मूल रूप से मतलब है कि आपका बेंचमार्क System.arraycopy के अंदर byte[] सरणियों के साथ काम करता है। यह देखने के लिए कि यह arraycopy कहां है, आप async-profiler आजमा सकते हैं। से बुलाया गया।

3
apangin 14 सितंबर 2018, 10:45

वो कर गया काम

आपने सही अनुमान लगाया। _disjoint_arraycopy स्टब्स रन टाइम में विशेष रूप से सिस्टम.एरेकॉपी कॉल को तेज करने के लिए उत्पन्न कार्य हैं।

जब जेवीएम शुरू होता है, तो यह वर्तमान में उपलब्ध सीपीयू सुविधाओं का उपयोग करके कुछ रूटीन के लिए अनुकूलित मशीन कोड तैयार करता है। उदा. यदि CPU AVX2 का समर्थन करता है, तो उत्पन्न ऐरेकॉपी स्टब्स AVX2 निर्देशों का उपयोग करेंगे।

System.arraycopy हॉटस्पॉट आंतरिक विधि है। जब C2 द्वारा संकलित किया जाता है, तो System.arraycopy का एक आह्वान आवश्यक जांच करता है और फिर उत्पन्न सरणी स्टब रूटीन में से एक को कॉल करता है।

यदि StubRoutines::jbyte_disjoint_arraycopy सबसे गर्म क्षेत्र है, तो इसका मूल रूप से मतलब है कि आपका बेंचमार्क सिस्टम.एरेकॉपी के अंदर अधिकांश समय बाइट [] सरणियों से निपटने में बिताता है। आप यह देखने के लिए async-profiler आज़मा सकते हैं कि इस सरणी को कहाँ से कहा जाता है।

1
Rohit Kumar 26 जून 2020, 11:47