• 生成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
    ", 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.{}.{}.{}
    ".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
    ", 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
    ", 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
    ", 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 秒.

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

  • 相关阅读:
    大战设计模式【13】—— 组合模式
    大战设计模式【12】—— 迭代器模式
    大战设计模式【11】—— 模板方法模式
    大战设计模式【10】—— 外观模式
    linux命令进阶
    ansible普通用户su切换
    Ansible 进阶技巧
    ansible playbook对错误的处理
    ansible示例,离线安装etcd
    (原)centos7安装和使用greenplum4.3.12(详细版)
  • 原文地址:https://www.cnblogs.com/freedom-try/p/15292975.html
Copyright © 2020-2023  润新知