2009-02-03 6 views
11

मैं जावा एप्लिकेशन बना रहा हूं जो कुछ प्रोसेसिंग करेगा, फिर उपयोगकर्ता प्रतिक्रिया देने के लिए एक संदेश प्रदर्शित करने की आवश्यकता है।जावा संदेश संवाद बनाने के लिए सबसे तेज़ तरीका (स्विंग/awt/अन्य)?

हालांकि, यह अविश्वसनीय रूप से धीमा प्रतीत होता है - लौटने के लिए दो सेकंड से अधिक समय लग रहा है।

package SwingPlay; 

import javax.swing.JFrame; 

public class Dialog 
{ 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("DialogDemo"); 
    } 

} 

मैं के साथ कमांड लाइन से इस को क्रियान्वित कर रहा हूँ:

java -classpath . SwingPlay.Dialog 

आप देख सकते हैं

मैं स्रोत नीचे छीन स्पष्ट अपराधी के लिए, और यहां इस्तेमाल किया कोड है - मैं कुछ भी नहीं कर रहा हूं लेकिन एक जेफ्रेम बना रहा हूं, इसे प्रदर्शित नहीं कर रहा हूं।

मामले में इसे यहाँ प्रासंगिक है, मेरी java -version उत्पादन होता है:

java version "1.6.0_11" 
Java(TM) SE Runtime Environment (build 1.6.0_11-b03) 
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing) 

और यह (वर्तमान में) है विन XP SP2 के खिलाफ चल रहा है।


तो, पहला प्रश्न: यह इतना धीमा क्यों है?

अधिक महत्वपूर्ण बात यह है कि, मुझे बस एक साधारण संदेश (जीयूआई, सीएमडीलाइन नहीं) बिना देरी के प्रदर्शित किया जाना चाहिए - क्या कोई ऐसा करने के लिए कुछ कोड प्रदान कर सकता है?


अद्यतन:

के बारे में थोड़ी उपयोगी हो सकता है:
मैं कई के सिर 'होगा जो एक आवेदन पत्र बनाने रहा हूँ (यानी अलग यूजर इंटरफेस सभी एक ही मूल वर्गों का उपयोग करने के लिए जटिल भागों)।
मेरे पास वर्तमान में एक शुद्ध कमांड लाइन हेड है जो ठीक काम करता है - सीधे जवाब देता है।
मेरे पास नियमित बिंदु & के साथ एक मानक एप्लिकेशन भी होगा GUI पर क्लिक करें, और इस बिट के साथ समस्याओं की पूर्ववत न करें।
मैं वर्तमान में जो काम कर रहा हूं वह इन दोनों का एक संकर है - इसे एक रन बॉक्स (या समान लॉन्चर) से संभवतः तर्क के साथ लॉन्च किया जाएगा, और केवल इसे प्रभावी ढंग से, एक स्टेटस संदेश के साथ जवाब देने की आवश्यकता है, जिसे बर्खास्त किया जा सकता है एक महत्वपूर्ण प्रेस के साथ।

यह बाद वाला एक प्रश्न है जहां प्रश्न केंद्रित है।

जबकि मैं शैल स्क्रिप्ट्स के साथ अपने मौजूदा कमांड लाइन संस्करण का उपयोग करने का विरोध नहीं कर रहा हूं (हालांकि ऐसा नहीं लगता था कि यह आवश्यक होगा!), मौजूदा उत्तर यह सुझाव देते हैं कि चीजें मेरे लिए जितनी तेजी से चल रही हैं दूसरों के लिए - एक उदाहरण मेरे लिए 1460ms लेता है, बनाम 70 एमएमएस - एक महत्वपूर्ण अंतर।

उत्तर

0

जो आप शायद देख रहे हैं वह new SplashScreen functionality in Java 6 है। जेवीएम लोड होने की प्रतीक्षा करने के बजाय (किसी भी वीएम को लोड करने की हमेशा लागत होती है), इससे पहले स्क्रीन लोड हो जाएगी।

+0

मैं एक स्थिर छवि, लेकिन पाठ का गतिशील टुकड़ा प्रदर्शित नहीं कर रहा हूं। इसे एक और तरीका रखने के लिए, मैं stdout को एक GUI संदेश बॉक्स में रीडायरेक्ट करना चाहता हूं। यदि मैं वास्तव में System.out का उपयोग करता हूं।println यह जल्दी से वापस आता है, लेकिन स्पष्ट रूप से सही प्रारूप में नहीं। –

2

के बजाय AWT Window (या शायद Frame) बनाने के लिए यह बहुत तेज़ होगा क्योंकि बाद वाले को अतिरिक्त कक्षा फ़ाइलों का एक गैज़िलियन खींचना होगा।

+0

जबकि java.awt.Frame तेज है, यह अभी भी देरी के एक दूसरे से अधिक है। :( –

+0

हां, दुर्भाग्यवश यह वास्तव में तेज़ नहीं है। यदि आपके पास एक ही प्रोग्राम में सब कुछ है, तो असली कार्रवाई करने से पहले फ्रेम बनाएं और फिर जब आप पूरा कर लें तो इसे दिखाएं। यह कुल मिलाकर तेज़ नहीं होगा लेकिन यह निश्चित रूप से उस तरह से देखेंगे। – Bombe

+0

असली कार्रवाई एक झपकी में होती है, इसलिए दुर्भाग्य से मैं उस भ्रम को भी प्राप्त नहीं करता ... –

1

ओह, और यदि आपको जावा से संवाद दिखाने की ज़रूरत नहीं है तो आप KDialog (या यह गनोम समकक्ष) या कुछ समान उपयोग करने में देख सकते हैं।

+0

एप्लिकेशन के मूल को जावा होना आवश्यक है, लेकिन यदि मूलभूत इंटरफ़ेस का उपयोग करना बहुत धीमा है, तो मैं प्रोग्राम से प्रतिक्रिया प्रदर्शित करने के लिए खोल स्क्रिप्ट का उपयोग करने के साथ कर सकते हैं। –

+0

हां, जावा में जीयूआई से संबंधित कुछ चीज हमेशा धीमा (एर) होगी, इसे रोकने के लिए कोई रास्ता नहीं है, मूल जाने से कम (या तो जेएनआई या Runtime.exec() के साथ) – Bombe

4

मैं संदेश दिखाने के लिए JOptionPane का उपयोग करूंगा। यहां एक साधारण उदाहरण दिया गया है:

import javax.swing.*; 

public class OptionDemo { 
    public static void main(String[] args) throws Exception { 
     JOptionPane.showMessageDialog(null, "Hello World"); 
    } 
} 

मुझे डर है कि मैं जो देरी कर रहा हूं उसे समझा नहीं सकता हूं। मेरे सिस्टम पर, आपका कोड स्निपेट 500 मिलीसेकंड में चलता है।

+0

यह लगभग उसी गति की तरह लगता है जैसे मैंने कोशिश की एडब्ल्यूटी उदाहरण (एक सेकंड में, शायद 1.5 के आसपास), जो एक सुधार है, लेकिन फिर भी कष्टप्रद धीमी है। अगर मैं यह 500ms तक पहुंच सकता है जो स्वीकार्य हो सकता है। –

1

आप इस्तेमाल कर सकते हैं JOptionDialog

JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE); 
3

जावा इस के लिए गलत उपकरण है। जेवीएम की स्थापना करना जावा कोड की पहली पंक्ति को निष्पादित करने से पहले पृष्ठभूमि में बहुत सी चीजें हो रही हैं, और इसके आसपास जाने का कोई तरीका नहीं है।

+0

यदि JVM कारण है, तो System.out.println ('text') के माध्यम से, कंसोल पर आउटपुट करते समय धीमा क्यों नहीं होता है? –

+3

@ पीटर: चूंकि जेवीएम एडब्ल्यूटी उप-सिस्टम शुरू नहीं करता है, यदि इसकी आवश्यकता नहीं है। यह सबसे अधिक संभावना है कि इस मामले में देरी हो रही है। –

10

देरी का कारण यह है क्योंकि जावा एक व्याख्या की भाषा है और यह एक नया JVM (दुभाषिया)

वास्तव में फ्रेम बनाने में कुछ एमएस (मेरी मशीन में लगभग 70 एमएस से कम समय लगता शुरू करने के लिए समय लगता है)।

यदि यह जावा ऐप के भीतर उपयोग किया जा रहा है, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। यह लगभग तात्कालिक होगा (आपको इसके लिए जेडियलॉग या जॉप्शनपेन का उपयोग करना चाहिए)

यदि यह जावा ऐप के अंदर उपयोग नहीं किया जा रहा है, और 2 सेकंड इसे बहुत अधिक (और मुझे लगता है कि यह बहुत अधिक है) तो आपको विचार करना चाहिए नौकरी के लिए एक और उपकरण।

यहां बताया गया है मैं अपने कोड में समय को मापने:

import javax.swing.JFrame; 

public class Dialog { 

    public static void main(String[] args) { 
     long start = System.currentTimeMillis(); 
     JFrame frame = new JFrame("DialogDemo"); 
     System.out.println("Took: " + ( System.currentTimeMillis() - start )); 
    } 

} 
+0

हम्म, आपके कोड का उपयोग करके यहां औसत 1460 एमएस लगता है - यह आपके 70ms से बहुत धीमा है - इसलिए मेरे सेटअप में कुछ गड़बड़ होनी चाहिए? कोड का यह विशिष्ट बिट शेल स्क्रिप्ट का उपयोग कर सकता है, लेकिन मैं अभी भी यह जानना चाहूंगा कि मुझे आपके/दूसरों की तुलना में इतना बुरा प्रदर्शन क्यों मिल रहा है। –

+0

मेरी मशीन पर लगभग 400 से 500 एमएस लेता है (4-वर्षीय पेंटियम 3 एम 1.8 गीगाहर्ट्ज के साथ)। – Bombe

+0

70 एमएस System.out पर "लंबी शुरुआत ..." के बीच समाप्त हो गया है ... (जैसा कि परीक्षण द्वारा मुद्रित है) कंसोल से इसमें लगभग 1.5 सेकंड लगते हैं। लेकिन फिर, यह जेवीएम स्टार्टअप है। जावा ऐप के भीतर से आपको 1.5 अतिरिक्त नहीं मिलता है। – OscarRyz

0

आप NetBeans की तरह एक प्रोफाइलर के माध्यम से इसे चलाने की कोशिश की है? यदि मानक पुस्तकालय के अंदर गहराई से एक बाधा है, तो यह खोजने का एक अच्छा तरीका है।

2

क्या आपको संदेश बॉक्स प्रदर्शित करने के लिए जावा का उपयोग करने की आवश्यकता है? यदि बॉक्स आपके एप्लिकेशन के बाहर से आ रहा है, तो आप एक संवाद उत्पन्न करने के लिए कुछ और उपयोग करना चाहेंगे।

एक देशी विंडोज ऐप बनाने के लिए जो कि कमांड लाइन स्ट्रिंग से एक संदेश बॉक्स दिखाता है, केवल कुछ घंटों में ही लेता है। अधिकांश सामान्य स्क्रिप्टिंग भाषाओं में इसे करने के तरीके भी हो सकते हैं। यहाँ कमांड लाइन के माध्यम से जावास्क्रिप्ट के माध्यम से कुछ पुरुष से एक उदाहरण है:

http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html

1

चूंकि आप इस को तेज करने में रुचि रखते हैं, और भूमि के ऊपर से ज्यादातर के बाद से JVM स्टार्टअप भूमि के ऊपर हो रहा है, Nailgun जो करना है की जाँच हर समय पृष्ठभूमि में चल रहे JVM को रखकर धीमे JVM स्टार्टअप को संबोधित करें। आपके मामले में, एक रन के बाद स्विंग लाइब्रेरी भी कैश होने पर समाप्त हो जाएगी (और उम्मीद है कि कुछ और जेआईटी भी चलाएंगे), और ओवरहेड को कम कर देगा।

हालांकि इस दृष्टिकोण से पृष्ठभूमि जेवीएम के कारण स्मृति उपयोग में वृद्धि होगी और अन्य समस्याएं भी हो सकती हैं क्योंकि यह निर्धारित करने के लिए सीधा नहीं हो सकता है कि इसे कब बंद करना है।

+0

ड्रिप https://github.com/flatland/drip भी देखें – rogerdpack

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