fopen,fclose的效率

Mik*_*e M 3 c io performance fopen for-loop

如果在嵌套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;
}
Run Code Online (Sandbox Code Playgroud)

要么

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;
}
Run Code Online (Sandbox Code Playgroud)

tan*_*grs 12

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

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

测试程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

机器是2.2GHz Core i7,8GB运行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
Run Code Online (Sandbox Code Playgroud)

总而言之,有区别吗?是.

有显着差异吗?是的,但仅适用于大量(ish)迭代次数.

有关系吗?这取决于.你打算做多少次迭代?直到大约1000次迭代,用户不太可能注意到差异.任何更高的东西,你会开始看到两个不同的实现之间的运行时间的一些显着差异.

在一天结束时,如果您可以在不费力的情况下编写效率代码,为什么故意使用效率较低的算法呢?