为什么我的C++程序运行速度只有C的一半[duplicate]

q0qdq0h2  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(165)
    • 此问题在此处已有答案**:

Why is C++ slower than C when doing literaly nothing(2个答案)
Why is std::cout so time consuming?(1个答案)
'printf' vs. 'cout' in C++(16个答案)
16小时前关门了。
我用C和C编写程序来寻找水仙花的数量,发现C程序的速度只有C的一半(我用bash脚本来重复运行和测量时间),是什么原因呢?
main.c

#include <stdio.h>
#include <stdbool.h>

bool is(int number)
{
    int s = number;
    int t = 0;
    while(number)
    {
        t += (number % 10) * (number % 10) * (number % 10);
        number /= 10;
    }
    return t == s;
}

int main()
{
    for(int i = 100; i < 1000; i++)
    {
        if(is(i))
        {
            printf("%d\n",i);
        }
    }
    return 0;
}

编译:gcc main. c
main.cpp

#include <iostream>

using namespace std;

bool is(int number)
{
    int s = number;
    int t = 0;
    while(number)
    {
        t += (number % 10) * (number % 10) * (number % 10);
        number /= 10;
    }
    return t == s;
}

int main()
{
    for(int i = 100; i < 1000; i++)
    {
        if(is(i))
        {
            cout << i << endl;
        }
    }
    return 0;
}

编译:g ++ main.cpp
bash脚本(test.sh):对于{1..1000}中的i;做;完成
测试命令:时间/测试h

eanckbw9

eanckbw91#

您的基准测试远非理想,其结果基本上毫无意义。
1.它测量未优化的代码。未优化的编译不能生成快速代码。请使用-O2-O3
1.它测量运行迭代次数太少的代码,以排除随机波动和边缘效应。将迭代次数增加5个数量级。如果需要,添加一个外循环。
1.它将计算和I/O混在一起,并且不清楚哪一个占主导地位。#2应该纠正这一点,但是为了完全确定,在测试中只执行最小的I/O或根本不执行I/O(除非您正在对I/O进行基准测试)。
1.它将编译后的代码和bash代码集中在一起。#2也应该消除对bash脚本的需要。

svmlkihl

svmlkihl2#

我认为是“endl”过早地刷新了缓冲区。
标准::cout〈〈i〈〈“\n”;
这将创建一个新行但不刷新缓冲区。然后您可以std::cout〈〈endl;在return语句之前刷新缓冲区是一个很好的做法。但是,大多数编译器会在退出时刷新缓冲区。

相关问题