造成这种差异的原因......从C++到C?

Xpl*_*ore 5 c c++

我想知道为什么会一直这样...... !! 我在c中编写了两个程序,在c ++中编写了另一个程序.两者都执行相同的操作.即打印1到2000000之间的数字.此外,我在执行开始时设置计时器..并且在打印之后还打印所有经过的时间.c ++程序所用的时间总是大于交流程序.我觉得时间差异很大.我很想知道这是什么原因.. ???? ..

这是两个程序

//iotest.c

#include<stdio.h>
#include<time.h>

clock_t start=clock();

int main()
{
for(int i=0;i<2000000;i++)

printf("%d\n",i);

printf("Time Elapsed: %f\n",((double)clock()-start)/CLOCKS_PER_SEC);

return 0;

}
Run Code Online (Sandbox Code Playgroud)

//iotest.cpp

#include<iostream>

#include<time.h>

using namespace std;

clock_t start=clock();

int main()
{
    for(int i=0;i<2000000;i++)

    cout<<i<<endl;

    cout<<"Time elapsed "<<((double)clock()-start)/CLOCKS_PER_SEC<<endl;

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

// ver C++ 4.3.2通过发出命令编译c程序

g ++ iotest.c

执行给出

1

.

.

2000000

经过的时间:5.410000(并不总是相同..)

执行第二个程序

1

.

.

2000000

时间流逝:5.81(并非总是相同..)

Gab*_*abe 18

两个程序之间的区别在于C++版本使用endl,它不仅插入换行符而且刷新缓冲区.执行任何输出的缓慢部分是刷新缓冲区.

如果你使用C++程序,这两个程序的速度可能大致相同

count << i << "\n";
Run Code Online (Sandbox Code Playgroud)

以下两个程序实现了类似的执行时间:

C程序(a.c):

#include <stdio.h>
#include <time.h>

int main()
{
    clock_t start=clock();
    for (int i=0; i<2000000; i++) printf("%d\n",i);
    clock_t end=clock();

    fprintf(stderr, "Time Elapsed: %f\n",((double)end-start)/CLOCKS_PER_SEC);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译: gcc -O3 -std=c99 a.c

C++ - program(b.cpp):

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    clock_t start=clock();
    for (int i=0;i<2000000;i++) cout << i << '\n';
    clock_t end=clock();

    cerr << "Time elapsed " << ((double)end-start)/CLOCKS_PER_SEC << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译 g++ -O3 b.cpp

  • 我已经多次看到这个`endl`惊喜,我不禁想知道在同一个对象中包装`EOL`和`flush`是不是设计错误.没有初学者得到它,专家们已经很难学会了. (2认同)

Lig*_*ica 8

您已经在静态初始化时启动了时钟,并且您的C++标准库在静态初始化期间可能还有更多工作要做.

你也在反复冲洗你的流,而且iostreams有点慢.

做这个:

#include <iostream>
#include <ctime>

int main()
{
    std::clock_t start = std::clock();
    for (int i=0;i<2000000;i++)
       std::cout << i << '\n';
    std::cout << "Time elapsed " << (static_cast<double>(std::clock()-start)/CLOCKS_PER_SEC) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个适当的基准测试将涉及您多次运行该程序,然后取结果的平均值.你的结果并不可靠.

(还要注意我是如何改变time.h它的C++对应物的ctime.)


Eri*_*rik 6

使用cout << endl会强制冲洗.如果你使用,可能差别会更小cout << "\n"

也就是说,iostream(在我个人看来)并不是最有效的机制,我希望printf仍然更快.如果输出速度是应用程序的性能瓶颈,你可能应该转到stdout,否则只需坚持使用类型安全的cout.