2012-10-27 40 views
5

मैं इस लाइब्रेरी का उपयोग करना चाहता हूं जो मैंने पाया, यह ज़ीरोमक का एक शुद्ध जावा पोर्ट (एक रैपर नहीं) है। मैं इसे जांचने की कोशिश कर रहा हूं और claims कुछ अच्छी संख्याओं के दौरान, मैं जो परीक्षण कर रहा हूं वह खराब परिणाम दे रहा है और यह स्थानीय रूप से भी किया जाता है (क्लाइंट और उसी मशीन पर सेवा करता है)। मुझे यकीन है कि यह कुछ है जो मैं गलत कर रहा हूं। यह लगभग लेता है। इस 10.000 संदेश लूप को निष्पादित करने के लिए 5 सेकंडयह जेरोमक्यू (ज़ीरोएमक्यू पोर्ट) बेंचमार्क इतना धीमा क्यों है?

मैंने जो कुछ किया है वह हैलो वर्ल्ड उदाहरण लेता है और विराम और sysouts हटा दिया जाता है।

सर्वर:: यहाँ कोड है

package guide; 

import org.jeromq.ZMQ; 

public class hwserver{ 
    public static void main(String[] args) throws Exception{ 

     // Prepare our context and socket 
     ZMQ.Context context = ZMQ.context(1); 
     ZMQ.Socket socket = context.socket(ZMQ.REP); 

     System.out.println("Binding hello world server"); 
     socket.bind ("tcp://*:5555");   

     while (true) {     
      byte[] reply = socket.recv(0); 
      String requestString = "Hello" ; 
      byte[] request = requestString.getBytes();    
      socket.send(request, 0);    
     }    
    } 
} 

ग्राहक:

package guide; 

import org.jeromq.ZMQ; 

public class hwclient{ 
    public static void main(String[] args){ 
     ZMQ.Context context = ZMQ.context(1); 
     ZMQ.Socket socket = context.socket(ZMQ.REQ); 
     socket.connect ("tcp://localhost:5555"); 

     System.out.println("Connecting to hello world server"); 

     long start = System.currentTimeMillis(); 
     for(int request_nbr = 0; request_nbr != 10_000; request_nbr++) { 
      String requestString = "Hello" ; 
      byte[] request = requestString.getBytes();   
      socket.send(request, 0); 
      byte[] reply = socket.recv(0);   
     } 
     long end = System.currentTimeMillis(); 
     System.out.println(end-start); 
     socket.close(); 
     context.term(); 
    } 
} 

है इस कोड को ठीक करने और कुछ सभ्य संख्या प्राप्त करने के लिए संभव है?

+0

अन्य ने उत्तर दिया है कि कुछ और करके - तेजी से संख्या कैसे प्राप्त करें। मैं बस यह इंगित करना चाहता हूं कि आपकी संख्या, पूर्ण शब्दों में, आवश्यक रूप से खराब नहीं है: औसत 0.5 एमएस प्रति राउंड-ट्रिप किए गए संदेश पर। और राउंडट्रिप के हिस्से के रूप में, संदेश को एक उच्चस्तरीय भाषा में पार्स किया जा रहा है, और इसका एक संसाधित संस्करण वापस भेजा गया है। उन आंकड़ों की तुलना करें जो आप एक साधारण आईसीएमपी पिंग कर रहे हैं, और आपको टीसीपी, जेरोमक्यू और आपके कोड के ओवरहेड के लिए एक महसूस हो रहा है। –

उत्तर

13

आप राउंड-ट्रिप अनुरोध-उत्तर कर रहे हैं, और यह सी ++ libzmq का उपयोग करके धीमा होगा। जब आप स्ट्रीमिंग करते हैं तो आपको केवल जेरोक्यूएम, ज़ीरोएमक्यू या किसी भी I/O पर तेज प्रदर्शन मिलेगा।

आई/ओ और टीसीपी कैसे काम करता है, इस वजह से राउंड-ट्रिपिंग धीमी है। Libzmq पर हम गोल-ट्रिपिंग का उपयोग करके 20K संदेश/सेकेंड और स्ट्रीमिंग का उपयोग करके 8 एम/सेकंड कर सकते हैं। स्ट्रीमिंग में बैचिंग जैसे अतिरिक्त अनुकूलन हैं जिन्हें आप राउंड-ट्रिप अनुरोध-उत्तर के साथ नहीं कर सकते हैं।

एक थ्रूपुट प्रदर्शन परीक्षण के लिए, नोड 1 से नोड 2 तक 10 एम संदेश भेजें, फिर उन्हें प्राप्त करने पर एक एकल एसीके भेजें। ज़ीरोएमक्यू और जेरोएमक्यू पर, आपको गति में लगभग 3x अंतर देखना चाहिए।

3

पर

https://github.com/zeromq/jeromq/blob/master/src/test/java/guide/tripping.java

अतुल्यकालिक तेजी से तुल्यकालिक राउंड ट्रिप से था X40 तुल्यकालिक राउंड ट्रिप और अतुल्यकालिक राउंड ट्रिप के बीच प्रवाह क्षमता परीक्षण देखें।

यदि आप जेरोमक की पूरी गति को बेंचमार्क करना चाहते हैं, तो कृपया अपने पर्यावरण पर perf.LocalThr और perf.RemoteThr चलाएं।