【问题标题】:C# vs C++ for loop performance measurment用于循环性能测量的 C# 与 C++
【发布时间】:2016-01-30 23:26:42
【问题描述】:

顺便说一句,我想看看 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++ 比 C# 快得多。
  • 在循环中放置一个计数器,在你停止时钟后打印计数器的值。
  • @Galik 将被每个理智的编译器优化为 counter = numberOfLoops;。

标签: c# c++ performance for-loop


【解决方案1】:

没有“问题”。能够优化掉无用的代码是 C++ 的关键特性之一。由于内部循环什么都不做,所以每个理智的编译器都应该将其删除。

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

如果您想了解一些有关微基准的知识,您可能会对this 感兴趣。

【讨论】:

  • 我也试过num = num * j;,结果还是一样。
  • @pookie 同样,只分析有意义的代码。 C++ 编译器在消除无用代码方面做了很多工作。
【解决方案2】:

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

您可以通过不使用 O2、Ofast 等优化标志来避免这种行为。因为没有人会用真正的代码来做这件事,所以它不会显示 C++ 的真正性能。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多