c - fopen、fclose的效率

标签 c performance for-loop io fopen

如果在嵌套的 for 循环中迭代写入文件,在循环之前打开文件并在循环之后关闭它与在循环中打开和关闭在效率上有什么区别吗?请参阅以下内容:

int main(){
    FILE *file1;
    char filename;
    int i, j, N, M;

    for(i=0; i<N; i++){
        file1=fopen(filename, "a");
        for(j=0; j<M; j++){
            fprintf(file1,"%d %d\n", i, j);
        }
        fclose(file1);
    }
return 1;
}

int main(){
    FILE *file1;
    char filename;
    int i, j, N, M;

    file1=fopen(filename, "a");
    for(i=0; i<N; i++){
        for(j=0; j<M; j++){
            fprintf(file1, "%d %d\n", i, j);
        }
    }
    fclose(file1);
    return 1;
}

最佳答案

我做了一个快速基准测试,看看是否存在显着差异。该代码与您的代码略有不同,但它仍然显示出效率上的差异。另外,我没有费心去考虑缓存等......

你可以自己看看它是否重要。

测试程序:

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


#ifdef TEST1
void test(char *filename, int n) {
    int i;
    FILE *fp;

    for (i=0; i<n; i++) {
        fp = fopen(filename, "a");
        if (fp) {
            fprintf(fp, "%d\n", i);
            fclose(fp);
        }
    }
}
#else
void test(char *filename, int n) {
    int i;
    FILE *fp;

    fp = fopen(filename, "a");
    if (!fp)
        return;

    for (i=0; i<n; i++) {
        fprintf(fp, "%d\n", i);
    }

    fclose(fp);
}
#endif

int main(int argc, char *argv[]) {
    char *filename;
    int n;

    if (argc < 3)
        return -1;

    filename = argv[1];
    n = atoi(argv[2]);

    test(filename, n);

    return 0;
}

编译标志和基准标记命令:

gcc -DTEST1 -Wall -O3 -o test1 test.c
gcc -DTEST2 -Wall -O3 -o test2 test.c

time ./test1 test.bin n; rm test.bin # where n is the number of runs
time ./test2 test.bin n; rm test.bin # where n is the number of runs

机器是 2.2GHz Core i7、8GB RAM 运行 OS X。

结果:

   n   |  test1  |  test2
-------+---------+---------
10     | 0.009s  | 0.006s
100    | 0.036s  | 0.006s
1000   | 0.340s  | 0.007s
10000  | 2.535s  | 0.011s
100000 | 24.509s | 0.041s

所以总而言之,有区别吗?是的。

有显着差异吗?是的,但仅适用于大量(大概)迭代。

重要吗?这取决于。您计划进行多少次迭代?直到大约 1000 次迭代,用户不太可能注意到差异。任何更高的东西,您都会开始看到两种不同实现之间的运行时间存在一些显着差异。

归根结底,如果您可以不费吹灰之力地提高效率,为什么还要刻意使用效率较低的算法?

关于c - fopen、fclose的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26250744/

相关文章:

c - For-Loop计数器是否停留?

c - gcc 预处理器中的去字符串化

c - 通过 C API 访问 tensorflow 2.0 SavedModel 的输入和输出张量

java - 如何有效地返回具有给定位数的最大可能整数

php - json 列与多列

C 数组 - 对错误输入的错误响应?

c - 将 char/wide char 附加到 c 字符串

c - 我找不到包含 kstat_create 方法的头文件

c# - 如何以不错的速度在 C#/WinForms 中绘图?

Java数组循环方法返回数组中的最后一个值