2016-04-11 4 views
9

के साथ संकलित करने में कितना समय लगता है कभी-कभी जावा स्रोत फ़ाइल में थोड़ा सा संशोधन जैसे कि कुछ अतिरिक्त स्पष्ट कारणों को संकलक करने में मदद करने के लिए संकलक समय को एक जावा फ़ाइल के लिए 4 मिनट से 3 सेकंड तक संकलित कर सकता है (विशेष रूप से जावा में 8)।प्रत्येक फ़ाइल को एंटी

समस्या यह है: एक बड़ी जावा परियोजना में, आप कैसे पाते हैं कि कौन सी विशेष .java फ़ाइलें धीरे-धीरे संकलित हो रही हैं?

क्या एंटी-टाइम प्राप्त करने का कोई तरीका है प्रत्येक व्यक्ति को संकलित करने में कितना समय लगता है। जावा फ़ाइल?

+0

सिद्धांत में आप शायद यह संकलक का आह्वान करने के लिए जेएसआर 199 (जावा कंपाइलर एपीआई) का उपयोग कर एक कस्टम चींटी लक्ष्य के साथ ऐसा कर सकते हैं लेकिन यह बहुत सारे काम की तरह लगता है। क्या आप बस .class फ़ाइलों के टाइमस्टैम्प देख सकते हैं? संभवतः – Pace

+0

। तो बस संशोधन तिथियों के बीच डेल्टा की जांच करें? मुझे आश्चर्य है कि javac कमांड को बैच फ़ाइल में लपेटा जा सकता है, जो कि निष्पादित करने में कितना समय लगता है। फिर जवाक की बजाय किसी और चीज का उपयोग करने के लिए चींटी प्राप्त करें। – clinux

+4

समस्या यह है कि जावैक को एक समय में एक फ़ाइल नहीं कहा जाता है।जावैक एक वृद्धिशील कंपाइलर नहीं है और इसलिए एक ही समय में प्रत्येक फ़ाइल में लेना चाहिए। तो समय लगता है कि जावैक कितना समय लेता है वास्तव में पूरे संकलन में कितना समय लगता है उससे ज्यादा अलग नहीं है। – Pace

उत्तर

3

मुझे लगता है कि यह संभव हो सकता है। यहां मैंने जो पाया है:

यदि आप जावा 8 का उपयोग कर रहे हैं, तो आप संकलन के दौरान कुछ अतिरिक्त कार्यक्षमता जोड़ने के लिए संकलक के साथ Plugin पंजीकृत कर सकते हैं। प्रलेखन इस प्लग-इन के बारे में क्या कहना है:

यह उम्मीद है कि एक विशिष्ट प्लग में बस एक TaskListener रजिस्टर करेंगे संकलन के निष्पादन के दौरान की घटनाओं के बारे में सूचित किया जाना है, और काम के आराम के लिए किया जाएगा कि कार्य श्रोता द्वारा किया गया।

तो आप टास्कलिस्टर का उपयोग करने के लिए एक प्लगइन सेट कर सकते हैं, और जब कक्षा उत्पन्न हो रही है तो कार्य श्रोता लॉग टाइमस्टैम्प हो सकता है।

package xyz; 
import com.sun.source.util.JavacTask; 
import com.sun.source.util.Plugin; 

public class TimestampPlugin implements Plugin { 


    @Override 
    public String getName() { 
     return "Timestamp_Plugin"; 
    } 

    @Override 
    public void init(JavacTask task, String... strings) { 
     task.setTaskListener(new FileTimestampListener()); 
    } 
} 

Documentation for TaskListener। एक कार्य श्रोता TaskEvent पारित किया गया है, जिसमें Kind है। आपके मामले में ऐसा लगता है कि आप पीढ़ी में दिलचस्पी रखते हैं।

package xyz; 
import com.sun.source.util.TaskEvent; 
import com.sun.source.util.TaskListener; 

import java.util.HashMap; 

public class FileTimestampListener implements TaskListener { 
    HashMap<String, Long> timeStampMap = new HashMap<>(); 

    @Override 
    public void started(TaskEvent taskEvent) { 
     if(TaskEvent.Kind.GENERATE.equals(taskEvent.getKind())) { 
      String name = taskEvent.getSourceFile().getName(); 
      timeStampMap.put(name, System.currentTimeMillis()); 
     } 
    } 

    @Override 
    public void finished(TaskEvent taskEvent) { 
     if(TaskEvent.Kind.GENERATE.equals(taskEvent.getKind())) { 
      String name = taskEvent.getSourceFile().getName(); 
      System.out.println("Generated " + name + " over " + (System.currentTimeMillis() - timeStampMap.get(name)) + " milliseconds"); 
     } 
    } 
} 

यह एक साधारण उदाहरण है लेकिन इसे इकट्ठा की गई जानकारी को संग्रहीत करने के लिए लॉग फ़ाइल की तरह कुछ सेट अप करने के लिए यहां से सरल होना चाहिए। जैसा कि आप प्लगइन के init फ़ंक्शन में देख सकते हैं, कमांड लाइन से प्लगइन को तर्क पारित किया जा सकता है।

प्लगइन को -Xplugin कंपाइलर तर्क के साथ निर्दिष्ट करके कॉन्फ़िगर किया गया है। मुझे यकीन नहीं है कि क्यों इसके बारे में this page पर कोई प्रलेखन प्रतीत नहीं होता है, लेकिन यह com.sun.source.util.Plugin नामक फ़ाइल सेट करके उपयोग किया जा सकता है (कार्यान्वित करने के लिए इंटरफ़ेस का FQ क्लास नाम) अपने मेटा-आईएनएफ/सेवाओं निर्देशिका में। तो:

META-INF 
|-- services 
    |-- com.sun.source.util.Plugin 

और उस फ़ाइल में इस वर्ग के आपके कार्यान्वयन के एफक्यू वर्ग का नाम सूचीबद्ध करें। तो फ़ाइल की सामग्री होगा: Timestamp_Plugin (ध्यान दें कि यह प्लगइन के getName() फ़ंक्शन द्वारा प्रदान की नाम है):

xyz.TimestampPlugin 

अपने चींटी कार्य में आप सिर्फ एक संकलक झंडा -Xplugin का उल्लेख करना होगा। क्लासपाथ, या एनोटेशन प्रोसेसर पथ पर संकलित प्लगइन और रनटाइम निर्भरताओं को भी प्रदान करने की आवश्यकता होगी, यदि कोई निर्दिष्ट है।