C# 与循环性能测量的 C++

C# vs C++ for loop performance measurment

本文关键字:C++ 性能测量 循环      更新时间:2023-10-16

对于踢球,我想看看 C# for 循环的速度与C++ for 循环的速度相比如何。我的测试是简单地迭代 for 循环 100000 次、100000 次,并对结果求平均值。

这是我的 C# 实现:

 static void Main(string[] args) {
    var numberOfMeasurements = 100000;
    var numberOfLoops = 100000;
    var measurements = new List < long > ();
    var stopwatch = new Stopwatch();
    for (var i = 0; i < numberOfMeasurements; i++) {
       stopwatch.Start();
       for (int j = 0; j < numberOfLoops; j++) {}
       measurements.Add(stopwatch.ElapsedMilliseconds);
    }
    Console.WriteLine("Average runtime = " + measurements.Average() + " ms.");
    Console.Read();
 }

结果:Average runtime = 10301.92929 ms.

这是我C++实现:

void TestA()
{
    auto numberOfMeasurements = 100000;
    auto numberOfLoops = 100000;
    std::vector<long> measurements;
    for (size_t i = 0; i < numberOfMeasurements; i++)
    {
        auto start = clock();
        for (size_t j = 0; j < numberOfLoops; j++){}
        auto duration = start - clock();
        measurements.push_back(duration);
    }
    long avg = std::accumulate(measurements.begin(), measurements.end(), 0.0) / measurements.size();
    std::cout << "TestB: Time taken in milliseconds: " << avg << std::endl;
}
int main()
{
    TestA();
    return 0;
}

结果:TestA: Time taken in milliseconds: 0

当我看了

measurements里的东西时,我注意到它充满了零......那么,它是什么,这里有什么问题?是clock吗?有没有更好/正确的方法来测量for循环?

没有"问题"。能够优化无用的代码是C++的关键功能之一。由于内部循环不执行任何操作,因此每个理智的编译器都应该将其删除。

每日提示:仅分析有意义的代码。

如果你想了解一些关于微基准测试的知识,你可能会对此感兴趣。

正如"Baum mit Augen"已经说过的那样,编译器将删除不执行任何操作的代码。这是"基准测试"C++代码时常见的错误。如果你创建某种基准函数,它只计算一些永远不会使用的东西(不会在代码中返回或以其他方式使用),也会发生同样的事情 - 编译器只会删除它。

您可以通过不使用 O2、Ofast 等优化标志来避免此行为。由于没有人会用真正的代码来做到这一点,所以它不会显示C++的真实性能。

TL;DR 只需对实际生产代码进行基准测试。