मैं अभी भी एक सामान्य सरणी प्रकार Tutput को TInput प्रकार के अन्य सरणी में परिवर्तित करने का एक तेज़ तरीका ढूंढने का प्रयास कर रहा हूं। मेरे सभी सरणी हमेशा एक संख्यात्मक डेटाटाइप के होते हैं, लेकिन सी # के पास संख्यात्मक रूप से अनुरोध किए जाने पर संख्यात्मक बाधा नहीं होती है, इसलिए मुझे वर्तमान में इस बाधा के साथ रहना है। सुझाव दिया गया है, जैसे किसी ऑब्जेक्ट को कास्ट करना, मेरी कास्ट को बहुत धीमा करना प्रतीत होता है। वर्तमान में मेरे पास एक बड़ा है/अन्यथा उस प्रकार के चेक को टाइप करें और पॉइंटर अंकगणितीय का उपयोग करके परिभाषित प्रकार पर डाला जाए, लेकिन भविष्य के लिए इसे संभालने के लिए यह बहुत बड़ा तरीका है। समांतर। पॉइंटर्स से छुटकारा पाने और चीज को तेज करने के लिए एक अच्छा तरीका प्रतीत होता है, लेकिन फिर भी सी # जेनेरिक बाधाएं एक समस्या प्रतीत होती हैं, लेकिन फिर भी नीचे दिए गए कोड में टाउट एक समस्या है। यहाँ मेरी कोड है:एक जेनेरिक सरणी को किसी अन्य प्रकार में कैसे डाला जाए?
public static OutputType[] Cast<InputType, OutputType>(InputType[] inputArray_in)
{
var aRange = Partitioner.Create(0, inputArray_in.Length);
OutputType[] aResult = new OutputType[inputArray_in.Length];
Parallel.ForEach(aRange, (r) =>
{
for (int i = r.Item1; i < r.Item2; i++)
{
aResult[i] = (OutputType)(inputArray_in[i]);
}
});
return aResult;
}
उदाहरण:
float[] A = { 0.1f, 0.2f, 0.6f };
int []B = Cast<float, int>(A);
सभी मामलों में मेरी सरणी प्रकार संख्यात्मक मानों (नाव, लघु, डबल, ...) और समय के सबसे अधिक कर रहे हैं, सरणियों के बारे में हैं 512x512 छवियां, लेकिन वॉल्यूम में लगभग 1000 स्लाइसों के ढेर में। क्या आपको ऐसा करने का एक आसान तरीका रखने का कोई मौका मिलता है?
टेस्ट कोड
public static class CastTest
{
delegate double[] CastMethod(int[] input);
public static unsafe double[] Cast1(int[] input)
{
int N = input.Length;
double[] output = new double[N];
for (int i = 0; i < N; i++) output[i] = (double)(input[i]);
return output;
}
public static unsafe double[] Cast2(int[] input)
{
int N = input.Length;
double[] output = new double[N];
fixed (double* output_pinned = output)
{
double* outp = output_pinned;
fixed (int* input_pinned = input)
{
int* inp = input_pinned;
for (int i = 0; i < N; i++, inp++, outp++) *outp = (double)(*inp);
}
return output;
}
}
public static unsafe double[] Cast3(int[] input)
{
int N = input.Length;
double[] output = new double[N];
fixed (double* output_pinned = output)
{
double* outp = output_pinned;
fixed (int* input_pinned = input)
{
int* inp = input_pinned;
for (int i = 0; i < N; i++) outp[i] = (double)(inp[i]);
}
return output;
}
}
public static unsafe double[] Cast4(int[] input)
{
int N = input.Length;
double[] output = new double[N];
fixed (double* output_pinned = output)
{
fixed (int* input_pinned = input)
{
for (int i = 0; i < N; i++) output_pinned[i] = (double)(input_pinned[i]);
}
}
return output;
}
public static unsafe double[] Cast5(int[] input)
{
return Array.ConvertAll<int, double>(input, x => (double)x);
}
public static double[] Cast6(int[] input)
{
var aRange = Partitioner.Create(0, input.Length);
int N = input.Length;
double[] output = new double[N];
Parallel.ForEach(aRange, (r) =>
{
for (int i = r.Item1; i < r.Item2; i++) output[i] = (double)(input[i]);
});
return output;
}
public unsafe static double[] Cast7(int[] input)
{
var aRange = Partitioner.Create(0, input.Length);
int N = input.Length;
double[] output = new double[N];
Parallel.ForEach(aRange, (r) =>
{
fixed (double* output_pinned = output)
{
double* outp = output_pinned + r.Item1;
fixed (int* input_pinned = input)
{
int* inp = input_pinned + r.Item1;
for (int i = r.Item1; i < r.Item2; i++, outp++, inp++) *outp = (double)(*inp);
}
}
});
return output;
}
public unsafe static double[] Cast8(int[] input)
{
var result = (from m in input.AsParallel() select (double)m).ToArray();
return result;
}
public static double[] Cast9(int[] input)
{
return (from m in input select (double)m).ToArray();
}
public static double[] Cast10(int[] input)
{
return (from m in input.AsParallel() select (double)m).ToArray();
}
public static double[] Cast11(int[] input)
{
return new List<double>(input.Select(p => (double)p)).ToArray();
}
static int[] A = new int[100000];
const int runs = 10000;
public static void StartTest()
{
TestMethod("1", Cast1);
TestMethod("2", Cast2);
TestMethod("3", Cast3);
TestMethod("4", Cast4);
TestMethod("5", Cast5);
TestMethod("6", Cast6);
TestMethod("7", Cast7);
TestMethod("8", Cast8);
TestMethod("9", Cast9);
TestMethod("10", Cast10);
TestMethod("11", Cast11);
}
static void TestMethod(string Name, CastMethod method)
{
var timer = Stopwatch.StartNew();
for (int i = 0; i < runs; i++) { double[] res = method(A); }
timer.Stop();
Console.WriteLine(String.Format("{0}: {1}ms", Name, timer.ElapsedMilliseconds));
}
}
धन्यवाद मार्टिन
आप एक विशिष्ट उदाहरण दे सकते हैं यहां 'इनपुट टाइप', 'आउटपुट टाइप' और 'टाउट' क्या हो सकता है? –
हाय मार्क, मुझे खेद है कि मैंने कोड में गलती की। मैंने एक अद्यतन किया। – msedi
इसे linq में कर रहा है एक फर्क पड़ता है? (मैं देव पर्यावरण के पास नहीं हूं लेकिन यह मोटे तौर पर इसके बारे में है) var परिणाम = (एम से लेकर श्रेणी में। एस्परेल() चयन (int) एम) .ToArray(); – Peter