繁体   English   中英

C-for-loop在C for-loop上的较大范围的降级性能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM