循环1亿次进行double类型的累加计算:
double run(int n, function<double(double, double) > f)
{
double s = 0;
for (int i = 0; i < n; ++i)
s = f(s, i); //s +=i;
return s;
}
1、循环中直接计算,c#和c++都耗时0.14秒左右
2、循环中调用静态函数计算,c#和c++都耗时0.14秒左右,函数调用被内联优化了,没有开销
3、循环中调用lambda或函数指针,c#和c++都耗时0.29秒左右,函数调用开销明显。
结论:
1、这个场景下C++和C# 性能基本一样,没有区别。
2、lambda和函数指针无法被内联优化,代价相对较高,不宜在小粒度+大量循环中使用。
如果2是真实的,那么标准库和boost的函数式编程中大量使用到lambda、functor和函数指针
将明显影响对规模较大的容器的计算效率,这时候直接用循环效率更高。
测试环境:msvc143, dotnet6
--
FROM 123.112.71.*