生成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秒))

扩展,时间的花费探究

  1. 对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 秒.

结论:写入数据很花时间,无论是对缓存的写入还是对文件的写入都很花时间;所以,能不写数据就不写数据。

posted @ 2021-09-16 12:35  enjoy_jun  阅读(83)  评论(0编辑  收藏  举报