C#vs C++;用于环路性能测量 踢,我想看看循环的C++的速度与循环的C++的速度是怎样的。我的测试是简单地在for循环上迭代100000次,100000次,然后平均结果
以下是我的C#实现:C#vs C++;用于环路性能测量 踢,我想看看循环的C++的速度与循环的C++的速度是怎样的。我的测试是简单地在for循环上迭代100000次,100000次,然后平均结果,c#,c++,performance,for-loop,C#,C++,Performance,For Loop,以下是我的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 < numberOfMeasurem
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();
}
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:以毫秒为单位的时间:0
当我查看测量值中的内容时,我注意到它充满了零。。。那么,这是什么问题呢?它是时钟吗?是否有更好/正确的方法来测量for循环?没有“问题”。能够优化无用代码是C++的关键特性之一。由于内部循环不起任何作用,因此每个sane编译器都应该删除它
每日小贴士:只分析有意义的代码
如果你想了解一些关于微基准测试的知识,你可能会感兴趣。正如“Baum-mit-Augen”已经说过的那样,编译器将删除不起任何作用的代码。这是“基准”C++代码时常见的错误。如果您创建某种基准函数,只计算一些永远不会使用(不会在代码中返回或以其他方式使用)的东西,那么同样的情况也会发生——编译器只会删除它
您可以通过不使用优化标志(如O2、Ofast等)来避免这种行为。因为没有人会用真实的代码来做,所以它不能显示C++的真实性能。
TL;DR 只需标出实际的生产代码。循环可能被优化了,因为它是空的。显然,C++比C语言快得多。将计数器放入循环中,停止时钟后打印计数器的值。@Galik将被优化为counter=numberOfLoops我也试过num=num*j代码>,但结果是一样的。@pookie再次强调,只分析有意义的代码。C++编译器在消除无用代码方面投入了大量的工作。