स्प्लिट के लिए, 32-बिट मशीन पर उलंग को संभालना वास्तव में धीमा है, इसलिए निश्चित रूप से कम हो जाता है। यदि आप वास्तव में उलझन चाहते हैं, तो दो संस्करणों को लागू करें, 32-बिट के लिए एक, 64-बिट के लिए एक।
आपको यह भी मापना चाहिए कि एक समय में बाइट को संभालना तेज है या नहीं।
स्मृति आवंटन की लागत को प्रोफ़ाइल करने की आवश्यकता है। यदि यह काफी बड़ा है, तो कई कॉलों में स्मृति का पुन: उपयोग करने का प्रयास करें।
अन्य:
ToString: यह "(" + Offset.ToString() + "," + Length.ToString() + ")" का उपयोग करने के लिए तेजी से है,
GetHashCode: कोशिश निश्चित (बाइट * ख = & बफर [ऑफसेट])
इस संस्करण वास्तव में तेजी से होना चाहिए, अगर कई बार इस्तेमाल किया। मुख्य बिंदु: आंतरिक सरणी के बाद सही आकार में विस्तारित होने के बाद कोई नई स्मृति आवंटन, न्यूनतम डेटा प्रति।
class ArraySplitter
{
private byte[] m_data;
private int m_count;
private int[] m_stops;
private void AddRange(int start, int stop)
{
// Skip empty range
if (start > stop)
{
return;
}
// Grow array if needed
if ((m_stops == null) || (m_stops.Length < (m_count + 2)))
{
int[] old = m_stops;
m_stops = new int[m_count * 3/2 + 4];
if (old != null)
{
old.CopyTo(m_stops, 0);
}
}
m_stops[m_count++] = start;
m_stops[m_count++] = stop;
}
public int Split(byte[] data, byte sep)
{
m_data = data;
m_count = 0; // reuse m_stops
int last = 0;
for (int i = 0; i < data.Length; i ++)
{
if (data[i] == sep)
{
AddRange(last, i - 1);
last = i + 1;
}
}
AddRange(last, data.Length - 1);
return m_count/2;
}
public ArraySegment<byte> this[int index]
{
get
{
index *= 2;
int start = m_stops[index];
return new ArraySegment<byte>(m_data, start, m_stops[index + 1] - start + 1);
}
}
}
टेस्ट कार्यक्रम:
static void Main(string[] args)
{
int count = 1000 * 1000;
byte[] data = new byte[count];
for (int i = 0; i < count; i++)
{
data[i] = (byte) i;
}
Stopwatch watch = new Stopwatch();
for (int r = 0; r < 10; r++)
{
watch.Reset();
watch.Start();
int len = 0;
foreach (var seg in data.MySplit(13))
{
len += seg.Count;
}
watch.Stop();
Console.WriteLine("MySplit : {0} {1,8:N3} ms", len, watch.Elapsed.TotalMilliseconds);
watch.Reset();
watch.Start();
ArraySplitter splitter = new ArraySplitter();
int parts = splitter.Split(data, 13);
len = 0;
for (int i = 0; i < parts; i++)
{
len += splitter[i].Count;
}
watch.Stop();
Console.WriteLine("ArraySplitter: {0} {1,8:N3} ms", len, watch.Elapsed.TotalMilliseconds);
}
}
परिणाम:
MySplit : 996093 9.514 ms
ArraySplitter: 996093 4.754 ms
MySplit : 996093 7.760 ms
ArraySplitter: 996093 2.710 ms
MySplit : 996093 8.391 ms
ArraySplitter: 996093 3.510 ms
MySplit : 996093 9.677 ms
ArraySplitter: 996093 3.468 ms
MySplit : 996093 9.685 ms
ArraySplitter: 996093 3.370 ms
MySplit : 996093 9.700 ms
ArraySplitter: 996093 3.425 ms
MySplit : 996093 9.669 ms
ArraySplitter: 996093 3.519 ms
MySplit : 996093 9.844 ms
ArraySplitter: 996093 3.416 ms
MySplit : 996093 9.721 ms
ArraySplitter: 996093 3.685 ms
MySplit : 996093 9.703 ms
ArraySplitter: 996093 3.470 ms
हम अपने * "अनुकूलित" स्प्लिट * के संस्करण देख सकते हैं ताकि हम इसमें कैसे सुधार करने के लिए के बारे में सोच सकते हैं? –
पोर्टेबल पोर्टेबल क्लास लाइब्रेरी के अर्थ में पोर्टेबल जैसा वर्णन किया गया है: http://msdn.microsoft.com/en-us/library/gg597391.aspx? –
आप अपना कोड '" अनुकूलित "संस्करण' लिंक में पा सकते हैं। –