मैं कुछ मल्टीथ्रेडिंग निर्माण के साथ प्रयोग कर रहा हूं, लेकिन किसी भी तरह ऐसा लगता है कि मल्टीथ्रेडिंग एक थ्रेड से तेज नहीं है। मैंने इसे एक नेस्टेड लूप (1000x1000) के साथ एक बहुत ही सरल परीक्षण में संकुचित कर दिया जिसमें सिस्टम केवल मायने रखता है।
नीचे मैंने एकल थ्रेडिंग और मल्टीथ्रेडिंग और उन्हें निष्पादित करने के लिए कोड पोस्ट किया है।
परिणाम यह है कि एकल धागा लगभग 110 एमएस में लूप को पूरा करता है, जबकि दो थ्रेड भी 112 एमएस लेते हैं।
मुझे नहीं लगता कि समस्या multithreading का ओवरहेड है। अगर मैं केवल थ्रेडपूलएक्सएटर को दोनों रननेबल्स सबमिट करता हूं, तो यह एकल थ्रेड के आधे समय में निष्पादित होता है, जो समझ में आता है। लेकिन उस दूसरे रननेबल को जोड़कर यह 10 गुना धीमा हो जाता है। 3.00 गीगा कोर दोनों 100% चल रहे हैं।
मुझे लगता है कि यह पीसी-विशिष्ट हो सकता है, क्योंकि किसी और के पीसी ने मल्टीथ्रेडिंग पर डबल-स्पीड परिणाम दिखाए हैं। लेकिन फिर, मैं इसके बारे में क्या कर सकता हूं? मेरे पास इंटेल पेंटियम 4 3.00 गीगाहर्ट्ज (2 सीपीयू) और जावा जेआर 6 है।
टेस्ट कोड:मल्टीथ्रेडिंग सिंगल थ्रेड (सरल लूप टेस्ट) से तेज नहीं है
// Single thread:
long start = System.nanoTime(); // Start timer
final int[] i = new int[1]; // This is to keep the test fair (see below)
int i = 0;
for(int x=0; x<10000; x++)
{
for(int y=0; y<10000; y++)
{
i++; // Just counting...
}
}
int i0[0] = i;
long end = System.nanoTime(); // Stop timer
इस कोड के बारे में 110 एमएस में मार डाला गया है।
// Two threads:
start = System.nanoTime(); // Start timer
// Two of the same kind of variables to count with as in the single thread.
final int[] i1 = new int [1];
final int[] i2 = new int [1];
// First partial task (0-5000)
Thread t1 = new Thread() {
@Override
public void run()
{
int i = 0;
for(int x=0; x<5000; x++)
for(int y=0; y<10000; y++)
i++;
i1[0] = i;
}
};
// Second partial task (5000-10000)
Thread t2 = new Thread() {
@Override
public void run()
{
int i = 0;
for(int x=5000; x<10000; x++)
for(int y=0; y<10000; y++)
i++;
int i2[0] = i;
}
};
// Start threads
t1.start();
t2.start();
// Wait for completion
try{
t1.join();
t2.join();
}catch(Exception e){
e.printStackTrace();
}
end = System.nanoTime(); // Stop timer
इस कोड के बारे में 112 एमएस में मार डाला गया है।
संपादित करें: मैंने रननेबल को थ्रेड में बदल दिया और निष्पादक सेवा (समस्या की सादगी के लिए) से छुटकारा पा लिया।
संपादित करें:, कुछ सुझाव
तो, क्या आपने सुझावों का प्रयास किया है? –
आह, पेंटियम 4 - मेरा अद्यतन उत्तर देखें :) – snemarch