fprintf()与fwrite()的速度

时间:2014-05-14 14:47:26

标签: c performance printf fwrite

我已经看到它在几个地方声明由于fprintf中的额外格式化操作,fprintf()操作比fwrite()操作慢一点。我想看看我是否真的可以测试这个,所以我有一些示例代码(我相信)就是这样。 结果当然总是有点不同,但大多数时候它们是这样的:

平均。没有。每个fwrite()的刻度超过1000000次写入:0.2000

平均。没有。每个fprintf()的刻度超过1000000次写入:0.1300

即。 fwrite()似乎实际上比fprintf()慢一点。 所以我的问题有两个方面:

一个。看着代码(下面)我曾经测试过这个,这是一个合理的测试方法       这样的事情?任何人都可以推测它产生的结果无论如何都是一种方式       准确地表示每个操作实际需要多长时间(就...而言)       蜱)?

B中。如果是这样,为什么假设fprintf()有fwrite()需要更长的时间       有效地更多地使用格式化?

代码:

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

#define NO_OF_WRITES 1000000

int main()
{
    clock_t start1, end1, start2, end2;
    FILE *fp;
    int i;
    float avg;
    float diffs = 0;
    uint8_t byte = 0x30;

    if ((fp = fopen("file.bin", "w")) == NULL)
    {
            printf("Error opening file for writing");
            exit(-1);
    }
    for (i = 0; i < NO_OF_WRITES; i++)
    {
            start1 = clock();
            fwrite(&byte, 1, 1, fp);
            end1 = clock();

            diffs += (end1 - start1);
    }

    avg = diffs / NO_OF_WRITES;
    printf("Avg. no. of ticks per fwrite() over %d writes: %.4f\n", NO_OF_WRITES, avg);

    diffs = 0;

    for (i = 0; i < NO_OF_WRITES; i++)
    {
            start2 = clock();
            fprintf(fp, "%c", byte);
            end2 = clock();

            diffs += (end2 - start2);
    }

    avg = diffs / NO_OF_WRITES;
    printf("Avg. no. of ticks per fprintf() over %d writes: %.4f\n", NO_OF_WRITES, avg);
    fclose(fp);
}

2 个答案:

答案 0 :(得分:1)

由于您正在测试单个字符的写入,因此很可能其他开销占主导地位。特别是,fwrite采用两个参数相乘,以确定要写入的总大小,并且单个乘法指令很可能占据fwrite所需的时间......

答案 1 :(得分:0)