我已经创建了一个函数来复制文件:读取 -> 缓存 -> 写入。我尝试多次增加缓存大小,查看它对复制文件所需时间的影响(约为50Mb)。
# include <assert.h>
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/wait.h>
# include <string.h>
# include <fcntl.h>
# include <time.h>
// Copy the file referred to by in to out
void copy (int in, int out, char *buffer, long long taille) {
int t;
while ((t = read(in, &buffer, sizeof taille))> 0)
write (out, &buffer, t);
if (t < 0)
perror("read");
}
int main(){
clock_t timing; //to time
int buffer_size = 1;
char * buffer = NULL;
// allocating memory for the buffer
buffer = malloc(sizeof(char)*buffer_size);
// test mémoire
if (!buffer) {
perror("malloc ini");
exit(1);
}
// temporary buffer to be able to increase the siwe of the buffer
char * temp_buffer = NULL;
// opening the files
int fichier1 = open("grosfichier",O_RDONLY);
int fichier2 = open("grosfichier_copy", O_WRONLY|O_CREAT);
for (int i=0; buffer_size <= 1048576; i++){
temp_buffer = realloc(buffer, buffer_size * sizeof(char));
if(!temp_buffer) {
perror("malloc temp_buffer");
exit(1);
}
buffer = temp_buffer;
timing = clock();
copy(fichier1,fichier2, buffer, buffer_size); //recopie l'entree std dans la sortie std
timing = clock() - timing;
printf("%d, buffer size = %d, time : %ld\n", i, buffer_size, timing);
remove("grosfichier_copie");
buffer_size *= 2;
}
// free(temp_buffer);
free(buffer);
close(fichier1);
close(fichier2);
return 0;
}
代码可以运行并复制文件,但定时器似乎无法正常工作。
0, buffer size = 1, time : 6298363
1, buffer size = 2, time : 1
2, buffer size = 4, time : 1
3, buffer size = 8, time : 1
4, buffer size = 16, time : 1
5, buffer size = 32, time : 1
6, buffer size = 64, time : 1
7, buffer size = 128, time : 1
8, buffer size = 256, time : 1
9, buffer size = 512, time : 1
10, buffer size = 1024, time : 1
11, buffer size = 2048, time : 1
12, buffer size = 4096, time : 1
13, buffer size = 8192, time : 1
14, buffer size = 16384, time : 1
15, buffer size = 32768, time : 0
16, buffer size = 65536, time : 1
17, buffer size = 131072, time : 4
18, buffer size = 262144, time : 1
19, buffer size = 524288, time : 2
20, buffer size = 1048576, time : 2
[Finished in 6.5s]
- 为什么第一次运行后似乎无法复制?(根据时间推算?)
- 我是否正确使用了free?(我尝试在循环中移动它,但它不运行)
- 我是否将缓冲区适当地传递给了copy函数?
谢谢!
编辑1:感谢您所有的评论! 我已经纠正了与循环内部文件打开和关闭、适当使用缓冲区以及变量类型相关的主要缺陷,如建议所示。我得到了更符合逻辑的结果:
0, buffer size = 1, time : 8069679
1, buffer size = 2, time : 4082421
2, buffer size = 4, time : 2041673
3, buffer size = 8, time : 1020645
4, buffer size = 16, time : 514176
...
但我仍然在努力处理write()错误。
编辑2:这个复制版本是否可以?
void copy (int in, int out, char *buffer, size_t taille) {
ssize_t t;
while ((t = read(in, buffer, taille))> 0){
if (write (out, buffer, t)<0){
perror("error writing");
}
}
if (t < 0)
perror("read");
}
%ld
格式说明符打印clock_t
? - Eugene Sh.malloc()
,则必须将其放在循环内部,但是如果您使用realloc()
,则不需要。main()
函数中的buffer_size
应该是size_t
类型,copy()
函数中的taille
也应该是size_t
类型。 但是您正在滥用copy()
函数中的缓冲区。O_CREAT
标志与open
时,应指定permission
。int fichier2 = open("grosfichier_copy", O_WRONLY|O_CREAT,0664);
- Achal