मैं यह पता लगाने की कोशिश कर रहा हूं कि जावा के एक्जिक्यूटर्स का सही तरीके से उपयोग कैसे करें। मुझे लगता है कि ExecutorService
पर कार्यों को सबमिट करने का एहसास है। हालांकि, मुझे आश्चर्य है कि यह उतना ऊंचा है जितना यह है।निष्पादक सेवा की आश्चर्यजनक प्रदर्शन ब्रेक-इवेंट पॉइंट --- अंगूठे के नियम?
मेरे कार्यक्रम को जितनी संभव हो उतनी कम विलंबता के साथ बड़ी मात्रा में डेटा (स्टॉक मार्केट डेटा) संसाधित करने की आवश्यकता है। अधिकांश गणना काफी सरल अंकगणितीय परिचालन हैं।
मैं बहुत सरल कुछ परीक्षण करने के लिए करने की कोशिश की: "Math.random() * Math.random()
"
सबसे सरल परीक्षण एक सरल पाश में इस गणना चलाता है। दूसरा परीक्षण अज्ञात रननेबल के अंदर समान गणना करता है (यह नई वस्तुओं को बनाने की लागत को मापने के लिए माना जाता है)। तीसरा परीक्षण Runnable
को ExecutorService
पर पास करता है (यह निष्पादकों को पेश करने की लागत को मापता है)।
(in milliseconds)
simpleCompuation:47
computationWithObjCreation:62
computationWithObjCreationAndExecutors:422
(के बारे में एक बार चार रन से बाहर है, पहले दो नंबर ऊपर बराबर होने के अंत)
नोटिस:
मैं अपने Dinky लैपटॉप पर परीक्षण (2 सीपीयू, 1.5 गिग राम) भाग गया कि निष्पादक एक धागे पर निष्पादन से कहीं अधिक दूर लेते हैं। संख्या 1 और 8 के बीच थ्रेड पूल आकार के लिए समान थी।
प्रश्न: क्या मुझे कुछ स्पष्ट याद आ रही है या क्या ये परिणाम अपेक्षित हैं? ये परिणाम मुझे बताते हैं कि किसी निष्पादक को जो भी कार्य मैं पास करता हूं उसे कुछ गैर-तुच्छ गणना करना चाहिए। यदि मैं लाखों संदेशों को संसाधित कर रहा हूं, और मुझे प्रत्येक संदेश पर बहुत ही सरल (और सस्ते) परिवर्तन करने की ज़रूरत है, तो भी मैं निष्पादकों का उपयोग करने में सक्षम नहीं हो सकता ... एकाधिक CPUs में कंप्यूटेशंस फैलाने की कोशिश कर रहा है, उन्हें एक धागे में कर रहे हैं। मूल रूप से सोचा था कि डिजाइन निर्णय अधिक जटिल हो जाता है। कोई विचार?
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ExecServicePerformance {
private static int count = 100000;
public static void main(String[] args) throws InterruptedException {
//warmup
simpleCompuation();
computationWithObjCreation();
computationWithObjCreationAndExecutors();
long start = System.currentTimeMillis();
simpleCompuation();
long stop = System.currentTimeMillis();
System.out.println("simpleCompuation:"+(stop-start));
start = System.currentTimeMillis();
computationWithObjCreation();
stop = System.currentTimeMillis();
System.out.println("computationWithObjCreation:"+(stop-start));
start = System.currentTimeMillis();
computationWithObjCreationAndExecutors();
stop = System.currentTimeMillis();
System.out.println("computationWithObjCreationAndExecutors:"+(stop-start));
}
private static void computationWithObjCreation() {
for(int i=0;i<count;i++){
new Runnable(){
@Override
public void run() {
double x = Math.random()*Math.random();
}
}.run();
}
}
private static void simpleCompuation() {
for(int i=0;i<count;i++){
double x = Math.random()*Math.random();
}
}
private static void computationWithObjCreationAndExecutors()
throws InterruptedException {
ExecutorService es = Executors.newFixedThreadPool(1);
for(int i=0;i<count;i++){
es.submit(new Runnable() {
@Override
public void run() {
double x = Math.random()*Math.random();
}
});
}
es.shutdown();
es.awaitTermination(10, TimeUnit.SECONDS);
}
}
वाह, पूर्वावलोकन ने अंतिम परिणाम की तुलना में कोड को कहीं बेहतर स्वरूपित किया। मैं इसे कैसे ठीक करूं? – Shahbaz
मैंने अभी इसे दोबारा सुधार दिया, बेहतर दिख रहा है? –
धन्यवाद जेडजेड कोडर, कोड अब ऐसा लगता है कि – Shahbaz