ऐसा लगता है कि int[]
के दो एरे जोड़ने पर UInt16[]
के दो सरणी जोड़ने पर सी # तेज है। यह मुझे कोई समझ नहीं आता है, क्योंकि मैंने माना होगा कि सरणी शब्द-संरेखित होंगी, और इस प्रकार int[]
को CPU से कम काम की आवश्यकता होगी, नहीं?UI arr16 arrays int arrays की तुलना में तेज़ी से क्यों दिखते हैं?
मैं नीचे परीक्षण कोड भाग गया, और निम्न परिणाम है:
Int for 1000 took 9896625613 tick (4227 msec)
UInt16 for 1000 took 6297688551 tick (2689 msec)
परीक्षण कोड निम्नलिखित है:
- एक बार
a
औरb
, नामित दो सरणियों बनाता है। - उन्हें एक बार यादृच्छिक डेटा से भरता है।
- स्टॉपवॉच शुरू करता है।
a
औरb
, आइटम-दर-आइटम जोड़ता है। यह 1000 बार किया जाता है।- स्टॉपवॉच को रोकता है।
- रिपोर्ट करता है कि यह कितना समय लगा।
यह int[] a, b
और UInt16 a,b
के लिए किया जाता है। और प्रत्येक समय मैं कोड चलाता हूं, UInt16
सरणी के परीक्षण int
सरणी से 30% -50% कम समय लेते हैं। क्या आप इसे मुझे समझा सकते हैं?
यहाँ कोड यदि आप अगर खुद के लिए कोशिश करना चाहते है,:
public static UInt16[] GenerateRandomDataUInt16(int length)
{
UInt16[] noise = new UInt16[length];
Random random = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < length; ++i)
{
noise[i] = (UInt16)random.Next();
}
return noise;
}
public static int[] GenerateRandomDataInt(int length)
{
int[] noise = new int[length];
Random random = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < length; ++i)
{
noise[i] = (int)random.Next();
}
return noise;
}
public static int[] AddInt(int[] a, int[] b)
{
int len = a.Length;
int[] result = new int[len];
for (int i = 0; i < len; ++i)
{
result[i] = (int)(a[i] + b[i]);
}
return result;
}
public static UInt16[] AddUInt16(UInt16[] a, UInt16[] b)
{
int len = a.Length;
UInt16[] result = new UInt16[len];
for (int i = 0; i < len; ++i)
{
result[i] = (ushort)(a[i] + b[i]);
}
return result;
}
public static void Main()
{
int count = 1000;
int len = 128 * 6000;
int[] aInt = GenerateRandomDataInt(len);
int[] bInt = GenerateRandomDataInt(len);
Stopwatch s = new Stopwatch();
s.Start();
for (int i=0; i<count; ++i)
{
int[] resultInt = AddInt(aInt, bInt);
}
s.Stop();
Console.WriteLine("Int for " + count
+ " took " + s.ElapsedTicks + " tick ("
+ s.ElapsedMilliseconds + " msec)");
UInt16[] aUInt16 = GenerateRandomDataUInt16(len);
UInt16[] bUInt16 = GenerateRandomDataUInt16(len);
s = new Stopwatch();
s.Start();
for (int i=0; i<count; ++i)
{
UInt16[] resultUInt16 = AddUInt16(aUInt16, bUInt16);
}
s.Stop();
Console.WriteLine("UInt16 for " + count
+ " took " + s.ElapsedTicks + " tick ("
+ s.ElapsedMilliseconds + " msec)");
}
क्या आपने इनलाइन तत्वों को जोड़ने के लिए प्रयास किया - बिना एडॉक्स फ़ंक्शन को कॉल किए, सरणी पास करने और लौटने के बिना? क्या आपने अन्य आकार के सरणी का प्रयास किया था? –
@Grzegorz Gierlik: वास्तव में अच्छा सवाल है। जैसा कि यह खड़ा है, 'int' रूटीन को शायद दोगुनी स्मृति आवंटित करना होगा। –
वह हार्डवेयर क्या है? मैं 15650 एमएससी और 14657 एमसीईसी में पहुंचता हूं (पढ़ा: कोई महत्वपूर्ण अंतर नहीं)। मुझे संदेह है कि माइक्रोबेंमार्क आपको फेंक रहा है - जेआईटी इंजन और वीएम अनुकूलित करने के लिए कुख्यात हैं। संख्याओं को जोड़ने की गति (16/32 बिट) * वही होगी * किसी भी आधुनिक x86/x64 CPU पर। हालांकि, अधिक संख्या में कैश लाइनों को भरने और संभवतः हस्तांतरण के लिए अधिक बस की आवश्यकता के मामले में बड़ी संख्या में एक छोटा जुर्माना हो सकता है। –