[英]Degrade performance of C# for-loop for bigger range over C for-loop
当我从C#调用ummanaged dll时,我已经对C#和C中for循环的性能进行了一些测试......
结果让我感到惊讶的是,当循环越过更大的范围时,C#的性能与C相比有所降低。对于较小的范围,C#表现出优于C的性能......但是,作为for-loop的上限范围增加,C#性能与C相比降低....
这是我的测试代码....
[DllImport("Testing.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int SumLoop(int lowLimit, int highLimit);
public static void Main(string[] args)
{
const int LowerRange = 1;
const int HigherRange = 1000000;
// Test with C# For Loop
var watch1 = new Stopwatch();
watch1.Start();
int sum = 0;
for (int i = LowerRange; i <= HigherRange; i++)
{
sum += i;
}
watch1.Stop();
long elapseTime1 = watch1.ElapsedMilliseconds;
// Test with C-for loop
var watch2 = new Stopwatch();
watch2.Start();
int sumFromC = SumLoop(LowerRange , HigherRange);
long elapseTime2 = watch2.ElapsedMilliseconds;
}
Testing.dll:
__declspec(dllexport) int SumLoop(int lowLimit, int highLimit)
{
int idx;
int totalSum = 0;
for(idx = lowLimit;idx<= highLimit; idx= idx +1)
{
totalSum += idx;
}
return totalSum;
}
测试结果:
测试1:
HigherRange:1000000
C#循环:4毫秒
C环:9毫秒
测试2:
HigherRange:10000000
C#循环:53毫秒
C环:36毫秒
测试3:
HigherRange:100000000
C#循环:418毫秒
C环:343毫秒
在这里,我开始进行上述测试,目的是C for-loop性能将优于C#循环,但它与我的理解完全相反,并且同意这个问题并同意......但是当我增加for循环的上限时,与C#相比,C性能表现良好......
现在,我认为测试的评估是错误的还是预期的性能结果?
这里发生的是你忽略了使用P / Invoke来调用C函数的固定开销。
C函数会比C#版本快但由于开销比较大调用它,C函数会似乎是小数组慢,因为调用的开销是总时间的比例相对较大。
但是,当您增加集合的大小时,开销将占总时间的一小部分,直到C版本的额外速度自我断言并且您开始看到它运行得更快。
如果你看一下C#函数的时间,你可以看到它确实或多或少地与N线性增长,这是你期望的。 将N增加100倍后,将T = 4与T = 418进行比较。正是您所期望的。 但由于上述原因,C时间似乎没有线性增加。
顺便提一下,如果你至少采用两个时间,你可以使用联立方程来解决:
T = K + XN
其中K是固定开销,X是每个元素的开销。
我根据您的时间计算出,调用非托管代码的固定开销大约是5.6毫秒,每个元素的开销是3.373737 x 10 ^ -6毫秒。
这个开销似乎有点大,但我猜测量数据存在一些不准确之处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.