关联fgets()函数的效率并使用>>操作者

时间:2014-03-09 08:18:21

标签: c++ performance iostream

我正在开发用于从C ++中的文件读取数据的程序。我提出了两种不同的方法来做到这一点。但我不确定哪个是有效的,我甚至不知道如何找到一个程序的效率。我给了你两个片段。请有人告诉我如何分析效率或告诉我哪些是有效的。

ifstream inFile( "Data" );
if( !inFile ){
    cerr << "Error :Unable to open the file";
    return -1;
}

string word;
while( inFile >> word )
    cout << word << endl ;

,另一种方法是:

FILE* input;
input = fopen("/home/jayanarayanan/Project/Data", "rb"); //file input
if ( input == NULL ) { perror (" Error opening File "); }
else{   
    char buffer[27];

    char *in;
    in = fgets (buffer, 28, input);

    output << in;
}

3 个答案:

答案 0 :(得分:2)

这里没有人能够给你一个现实的答案。除其他外,效率取决于:

  • 您的编译器。
  • 编译器的版本。
  • 用于调用编译器的设置。
  • 运行程序的操作系统。
  • 您收到的数据类型。
  • 您收到数据的频率。
  • 你的其他计划。

使用真实的输入数据测量目标系统的效率。只有这样你才能看到更好的东西,以及是否存在相关的差异。


编辑:一个好的开始(可能比任何猜测更好)将衡量你的程序完成所需的时间

答案 1 :(得分:1)

格式化输入&gt;&gt;众所周知,在iostreams中它很慢。

无论如何,在我看来,这不是一个公平的比较:ifstream >> std::string正在读一个用空格分隔的单词(而不是fgets所做的)。

可能你应该使用std::getline(对于std :: string)或istream::getline(对于char [])具有相似(但不完全相同)的功能。

此外

  • fgets()最多读取一个小于sizeof(缓冲区)的字符,将一个空字符(\ 0)添加到字符串的末尾。您应该使用fgets(buffer, 28, input);

  • 更改fgets(buffer, sizeof(buffer), input);
  • 在使用in之前检查{{1}}值。{/ p>

有些值得深思的话:

答案 2 :(得分:1)

应衡量绩效,而不是在互联网上询问。衡量申请的总时间。如果它“太慢”(无论这意味着什么),那么使用分析器,或添加代码来衡量程序的不同部分,找出它花费大部分时间的地方,并“修复”。我可以回答我的机器所做的事情,但是如果我测量一个ARM开发板,其中一个核心处理器运行在1000MHz,并且我在工作时使用的网络文件系统,它将不会给出与我使用我的相同的结果。家用台式机。瓶颈可能在不同的地方,编译器在不同结构中的效率也可能不同(x86与ARM)。

目前看来,我会说你的第一个代码是“安全的”,第二个代码是“不安全的”,这是一个比“更有效”更重要的因素

char buffer[27];

char *in;
in = fgets (buffer, 28, input);

这会将缓冲区覆盖一个字节,如果你运气不好(例如你在buffer后立即放置了一些其他数据,并在fgetscout << in;之间将其更新为非零,那么你可能会得到(很多,可能)垃圾打印,甚至崩溃)。

您的输入功能也可能会执行不同的操作,具体取决于您输入的内容。