如果在嵌套的 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/