मैं हाल ही में एक थ्रेडपूल पर निर्धारित 1000 कार्यों के लिए जावा बनाम सी # पर बेंचमार्क चला रहा हूं। सर्वर में 4 भौतिक प्रोसेसर हैं, प्रत्येक 8 कोर के साथ। ओएस सर्वर 2008 है, 32 जीबी मेमोरी है और प्रत्येक सीपीयू एक ज़ीऑन x7550 वेस्टमेरे/नेहलेम-सी है।जावा बनाम सी # मल्टीथ्रेडिंग प्रदर्शन, जावा धीमा क्यों हो रहा है? (ग्राफ और पूर्ण कोड शामिल)
संक्षेप में, जावा कार्यान्वयन 4 धागे पर सी # से बहुत तेज है लेकिन धागे की संख्या बढ़ने के साथ बहुत धीमी है। ऐसा लगता है कि सी # प्रति पुनरावृत्ति तेज हो गया है, जब थ्रेड गिनती बढ़ गई है। रेखांकन इस पोस्ट में शामिल हैं:
जावा कार्यान्वयन जावा 7 के साथ, एक 64 बिट हॉटस्पॉट JVM पर लिखा गया है और एक निर्वाहक सेवा का उपयोग ThreadPool मैं ऑनलाइन पाया (नीचे देखें) किया गया था। मैंने समवर्ती जीसी के लिए जेवीएम भी सेट किया।
सी # .net 3.5 पर लिखा गया था और ThreadPool codeproject से आया था: http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
(मैं नीचे दिए गए कोड को शामिल किया है)।
मेरे सवालों का:
1) क्यों जावा धीमी हो रही है, लेकिन सी # तेज हो रही है?
2) सी # के निष्पादन के समय क्यों उतार-चढ़ाव करते हैं? (यह हमारे मुख्य सवाल यह है कि)
हम आश्चर्य कहा कि क्या सी # में उतार-चढ़ाव स्मृति बस के कारण हुई थी बाहर maxed किया जा रहा ....
कोड (कृपया लॉकिंग के साथ त्रुटियों को उजागर नहीं करते हैं, यह अप्रासंगिक साथ है मेरी करना है):
जावा
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class PoolDemo {
static long FastestMemory = 2000000000;
static long SlowestMemory = 0;
static long TotalTime;
static long[] FileArray;
static DataOutputStream outs;
static FileOutputStream fout;
public static void main(String[] args) throws InterruptedException, FileNotFoundException {
int Iterations = Integer.parseInt(args[0]);
int ThreadSize = Integer.parseInt(args[1]);
FileArray = new long[Iterations];
fout = new FileOutputStream("server_testing.csv");
// fixed pool, unlimited queue
ExecutorService service = Executors.newFixedThreadPool(ThreadSize);
//ThreadPoolExecutor executor = (ThreadPoolExecutor) service;
for(int i = 0; i<Iterations; i++) {
Task t = new Task(i);
service.execute(t);
}
service.shutdown();
service.awaitTermination(90, TimeUnit.SECONDS);
System.out.println("Fastest: " + FastestMemory);
System.out.println("Average: " + TotalTime/Iterations);
for(int j=0; j<FileArray.length; j++){
new PrintStream(fout).println(FileArray[j] + ",");
}
}
private static class Task implements Runnable {
private int ID;
static Byte myByte = 0;
public Task(int index) {
this.ID = index;
}
@Override
public void run() {
long Start = System.nanoTime();
int Size1 = 10000000;
int Size2 = 2 * Size1;
int Size3 = Size1;
byte[] list1 = new byte[Size1];
byte[] list2 = new byte[Size2];
byte[] list3 = new byte[Size3];
for(int i=0; i<Size1; i++){
list1[i] = myByte;
}
for (int i = 0; i < Size2; i=i+2)
{
list2[i] = myByte;
}
for (int i = 0; i < Size3; i++)
{
byte temp = list1[i];
byte temp2 = list2[i];
list3[i] = temp;
list2[i] = temp;
list1[i] = temp2;
}
long Finish = System.nanoTime();
long Duration = Finish - Start;
FileArray[this.ID] = Duration;
TotalTime += Duration;
System.out.println("Individual Time " + this.ID + " \t: " + (Duration) + " nanoseconds");
if(Duration < FastestMemory){
FastestMemory = Duration;
}
if (Duration > SlowestMemory)
{
SlowestMemory = Duration;
}
}
}
}
सी #:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Amib.Threading;
using System.Diagnostics;
using System.IO;
using System.Runtime;
namespace ServerTesting
{
class Program
{
static long FastestMemory = 2000000000;
static long SlowestMemory = 0;
static long TotalTime = 0;
static int[] FileOutput;
static byte myByte = 56;
static System.IO.StreamWriter timeFile;
static System.IO.StreamWriter memoryFile;
static void Main(string[] args)
{
Console.WriteLine("Concurrent GC enabled: " + GCSettings.IsServerGC);
int Threads = Int32.Parse(args[1]);
int Iterations = Int32.Parse(args[0]);
timeFile = new System.IO.StreamWriter(Threads + "_" + Iterations + "_" + "time.csv");
FileOutput = new int[Iterations];
TestMemory(Threads, Iterations);
for (int j = 0; j < Iterations; j++)
{
timeFile.WriteLine(FileOutput[j] + ",");
}
timeFile.Close();
Console.ReadLine();
}
private static void TestMemory(int threads, int iterations)
{
SmartThreadPool pool = new SmartThreadPool();
pool.MaxThreads = threads;
Console.WriteLine("Launching " + iterations + " calculators with " + pool.MaxThreads + " threads");
for (int i = 0; i < iterations; i++)
{
pool.QueueWorkItem(new WorkItemCallback(MemoryIntensiveTask), i);
}
pool.WaitForIdle();
double avg = TotalTime/iterations;
Console.WriteLine("Avg Memory Time : " + avg);
Console.WriteLine("Fastest: " + FastestMemory + " ms");
Console.WriteLine("Slowest: " + SlowestMemory + " ms");
}
private static object MemoryIntensiveTask(object args)
{
DateTime start = DateTime.Now;
int Size1 = 10000000;
int Size2 = 2 * Size1;
int Size3 = Size1;
byte[] list1 = new byte[Size1];
byte[] list2 = new byte[Size2];
byte[] list3 = new byte[Size3];
for (int i = 0; i < Size1; i++)
{
list1[i] = myByte;
}
for (int i = 0; i < Size2; i = i + 2)
{
list2[i] = myByte;
}
for (int i = 0; i < Size3; i++)
{
byte temp = list1[i];
byte temp2 = list2[i];
list3[i] = temp;
list2[i] = temp;
list1[i] = temp2;
}
DateTime finish = DateTime.Now;
TimeSpan ts = finish - start;
long duration = ts.Milliseconds;
Console.WriteLine("Individual Time " + args + " \t: " + duration);
FileOutput[(int)args] = (int)duration;
TotalTime += duration;
if (duration < FastestMemory)
{
FastestMemory = duration;
}
if (duration > SlowestMemory)
{
SlowestMemory = duration;
}
return null;
}
}
}
आपको लगता है कि जावा में अपने पाश 'सी # में जबकि प्रत्येक चरण में एक' PrintStream' बनाता नोटिस 'आप खोलना केवल एक बार स्ट्रीमवाइटर? मुझे नहीं लगता कि यह घटना को समझाता है, लेकिन आपका परीक्षण मूल स्तर पर 100% सटीक नहीं है। – RonK
क्या आपने ThreadPoolExecutor क्लास की कोशिश की है? ThreadPoolExecutor को बड़ी संख्या में असीमित कार्यों के लिए बेहतर प्रदर्शन प्रदान करना माना जाता है। – ChadNC
@ चैनएनसी- धन्यवाद मैं इसे आजमाउंगा। – mezamorphic