C# 与循环性能测量的 C++
C# vs C++ for loop performance measurment
对于踢球,我想看看 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 只需对实际生产代码进行基准测试。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中测量postscript字体宽度
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 用时钟测量程序的运行时间
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 分析性能测量中的峰值
- 如何测量计算着色器的时间性能
- 如何在测量性能时减少循环的开销
- 测量直接显示滤波器的性能
- C# 与循环性能测量的 C++
- 在OpenGL ES 2.0中测量渲染到纹理性能
- Visual Studio 2010中测量C++项目性能的问题
- 性能测量与教授