【问题标题】:Using std::ios::sync_with_stdio(false) can be faster than scanf and printf?使用 std::ios::sync_with_stdio(false) 可以比 scanf 和 printf 更快吗?
【发布时间】:2017-01-11 13:51:09
【问题描述】:

我只知道使用 cin 和 cout 会比 scanf 和 printf 慢。但是,the top answer 说使用 std::ios::sync_with_stdio(false) 可以比 scanf&printf 更快。但是,我做了这个实验,发现它不对。是我的错吗?为什么?

什么是使用 cin&cout 比 scanf&printf 更快的正确代码,包括读取文件。谢谢。

这是我的代码:

生成数据

#include<cstdio>
#include<iostream>
#include<ctime>
#include<fstream>
#include<iomanip>
FILE *data = freopen("test.in","w",stdin);
//FILE *fi = freopen("test.in","r",stdin);
//FILE *fo = freopen("test.out","w",stdout);
int main()
{
    for(int i=1;i<10000000;i++)
        printf("%d\n",i);
    return 0;
}

使用scanf&printf

#include<cstdio>
#include<iostream>
#include<ctime>
#include<fstream>
#include<iomanip>
//FILE *data = freopen("test.in","w",stdin);
FILE *fi = freopen("test.in","r",stdin);
FILE *fo = freopen("test.out","w",stdout);
int main()
{
    int ans = 1;
    while(~scanf("%d",&ans))
    {
        printf("%d\n",ans);
    }
    return 0;
}

使用 cin & cout (std::ios::sync_with_stdio(true))

#include<cstdio>
#include<iostream>
#include<ctime>
#include<fstream>
#include<iomanip>
//FILE *data = freopen("test.in","w",stdin);
FILE *fi = freopen("test.in","r",stdin);
FILE *fo = freopen("test.out","w",stdout);
int main()
{
    std::ios::sync_with_stdio(true);
    int ans = 1;
    while(std::cin>>ans)
    {
        std::cout<<ans<<std::endl;
    }
    return 0;
}

使用 std::ios::sync_with_stdio(false)

#include<cstdio>
#include<iostream>
#include<ctime>
#include<fstream>
#include<iomanip>
//FILE *data = freopen("test.in","w",stdin);
FILE *fi = freopen("test.in","r",stdin);
FILE *fo = freopen("test.out","w",stdout);
int main()
{
    std::ios::sync_with_stdio(false);
    int ans = 1;
    while(std::cin>>ans)
    {
        std::cout<<ans<<std::endl;
    }
    return 0;
}

结果:

scanf version:                           4.918 seconds
iostream version:                        51.266 seconds
iostream with sync_with_stdio(false):    31.815 seconds

【问题讨论】:

  • 这是 C++ 代码,不是 C 代码。请删除c 标签
  • 不知道你为什么一直说“cousync_with_stdio”
  • 您了解“同步”和“异步”的含义吗?当您指定“同步”时,每个 I.O 都会在下一个操作开始之前完成。 IE。活动不重叠 I.E.按顺序。这使得一切都比“异步”I/O 花费更多的“挂钟”时间,在可能的情况下,同时执行多个活动。

标签: c++


【解决方案1】:

你每次都用std::endl刷新std::cout

不要那样做。相反,如果您想匹配printf 版本的行为,只需输出'\n'

std::cout << ans << '\n';

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 2022-01-15
    • 2018-01-11
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多