एक तरीका है जिससे आप गति सुधार सकते हैं Array.Copy
का उपयोग करके। यह निचले स्तर पर काम करने में सक्षम है जिसमें यह स्मृति के बड़े वर्गों को आवंटित करने वाला थोक है।
असाइनमेंट बैच करके आप सरणी को एक सेक्शन में स्वयं कॉपी कर सकते हैं।
उस पर, बैच स्वयं काफी प्रभावी ढंग से समानांतर हो सकते हैं।
यहां मेरा प्रारंभिक कोड है। 10 मिलियन वस्तुओं के नमूने सरणी के साथ मेरी मशीन (जिसमें केवल दो कोर हैं) पर, मुझे 15% या इतनी गति मिल रही थी। आपको बैच आकार के साथ खेलना होगा (इसे अपने पृष्ठ आकार के गुणकों में रहने के लिए इसे कुशल रखने के लिए प्रयास करें) ताकि आपके पास मौजूद वस्तुओं के आकार को ट्यून किया जा सके। छोटे सरणी के लिए यह आपके कोड के लगभग समान हो जाएगा क्योंकि यह पहले बैच को भरने से पहले नहीं मिलेगा, लेकिन यह उन मामलों में भी (ध्यान से) खराब नहीं होगा।
private const int batchSize = 1048576;
private static int[] GetDefaultSeriesArray2(int size, int value)
{
int[] result = new int[size];
//fill the first batch normally
int end = Math.Min(batchSize, size);
for (int i = 0; i < end; i++)
{
result[i] = value;
}
int numBatches = size/batchSize;
Parallel.For(1, numBatches, batch =>
{
Array.Copy(result, 0, result, batch * batchSize, batchSize);
});
//handle partial leftover batch
for (int i = numBatches * batchSize; i < size; i++)
{
result[i] = value;
}
return result;
}
क्या आप अपनी सरणी के सभी क्षेत्रों में 'मूल्य' सेट कर रहे हैं? – cheesemacfly
हां वह प्रत्येक तत्व को एक गैर-डिफ़ॉल्ट int मान पर सेट कर रहा है - और संभवतः यह माइक्रो ऑप्टिमाइज़ेशन को छोड़कर सबसे तेज़ तरीका है (कोई संदेह नहीं करेगा कि कुछ माइक्रो ऑप्टिमाइज़ेशन तकनीक दिखाएं) –
कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं, बिना किसी सरणी को प्रारंभ करना सी # में डिफ़ॉल्ट मूल्य एक ओ (एन) ऑपरेशन है। – Maciej