生成1000000个以上ip
C
#include <stdio.h>
int main(void)
{
FILE *fptr = fopen("ip.txt", "w");
for(int k=1; k<255; k++){
for(int j=1; j<255; j++){
for(int i=1; i<255; i++){
fprintf(fptr, "192.%d.%d.%d\n", k, j, i);
}
}
}
fclose(fptr);
return 0;
}
Python
# Generate more than 1,000,000 ip
f = open("ip.txt", "wt")
for k in range(1, 255):
for j in range(1, 255):
for i in range(1, 255):
f.write("192.{}.{}.{}\n".format(k, j, i))
f.close()
速度
- C 6.93 秒(测试三次(都是删除了原有的ip.txt)速度分别为6.91秒, 7.28秒, 6.60秒 平均为 6.93秒)
- Python 14.82 秒((测试三次(都是删除了原有的ip.txt)速度分别为14.63秒, 15.00秒, 14.84秒 平均为 14.82秒))
扩展,时间的花费探究
- 对C语言程序进行优化,先写入大块缓存,再写入文件.
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 254*254*16
int main(void)
{
char file_buffer[BUF_SIZE+64] = {0}; // 1 MB buffer, plus enough
int buffer_count = 0;
FILE *fptr = fopen("ip2.txt", "w");
for(int k=1; k<255; k++){
for(int j=1; j<255; j++){
for(int i=1; i<255; i++){
buffer_count += sprintf(&file_buffer[buffer_count], "192.%d.%d.%d\n", k, j, i);
continue;
}
}
fwrite(file_buffer, 1, buffer_count, fptr);
buffer_count = 0;
}
fclose(fptr);
return 0;
}
三次测试如下:
└─$ time ./1000000ip2 1 ⨯
real 5.62s
user 5.28s
sys 0.22s
cpu 97%
└─$ time ./1000000ip2
real 5.36s
user 5.11s
sys 0.16s
cpu 98%
└─$ time ./1000000ip2
real 5.78s
user 5.52s
sys 0.15s
cpu 98%
优化后平均时间为 5.8666 秒,比没优化前只快了一秒钟左右。
2.测试只写入大块缓存,不写入文件.
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 254*254*16
int main(void)
{
char file_buffer[BUF_SIZE+64] = {0}; // 1 MB buffer, plus enough
int buffer_count = 0;
FILE *fptr = fopen("ip2.txt", "w");
for(int k=1; k<255; k++){
for(int j=1; j<255; j++){
for(int i=1; i<255; i++){
buffer_count += sprintf(&file_buffer[buffer_count], "192.%d.%d.%d\n", k, j, i);
continue;
}
}
//fwrite(file_buffer, 1, buffer_count, fptr);
buffer_count = 0;
}
fclose(fptr);
return 0;
}
测试三次时间如下:
└─$ time ./1000000ip2
real 5.20s
user 5.13s
sys 0.01s
cpu 98%
└─$ time ./1000000ip2
real 5.11s
user 5.07s
sys 0.00s
cpu 99%
└─$ time ./1000000ip2
real 5.12s
user 5.09s
sys 0.00s
cpu 99%
只写入大块缓存,不写入文件的,平均时间为 5.14 秒;只比写入文件快了 0.7秒左右。
3.这次测试, 连大缓存都不写入的时间
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 254*254*16
int main(void)
{
char file_buffer[BUF_SIZE+64] = {0}; // 1 MB buffer, plus enough
int buffer_count = 0;
FILE *fptr = fopen("ip2.txt", "w");
for(int k=1; k<255; k++){
for(int j=1; j<255; j++){
for(int i=1; i<255; i++){
//buffer_count += sprintf(&file_buffer[buffer_count], "192.%d.%d.%d\n", k, j, i);
continue;
}
}
//fwrite(file_buffer, 1, buffer_count, fptr);
buffer_count = 0;
}
fclose(fptr);
return 0;
}
三次测试数据如下:
└─$ time ./1000000ip2
real 0.03s
user 0.03s
sys 0.00s
cpu 86%
└─$ time ./1000000ip2
real 0.03s
user 0.03s
sys 0.00s
cpu 86%
└─$ time ./1000000ip2
real 0.03s
user 0.03s
sys 0.00s
cpu 83%
平均时间为 0.03 秒.
结论:写入数据很花时间,无论是对缓存的写入还是对文件的写入都很花时间;所以,能不写数据就不写数据。