zoukankan      html  css  js  c++  java
  • 张兵杰 20200917-3 白名单

    此作业的要求参见 :https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11207

    代码托管地址如下:https://e.coding.net/zhangbj/whitelist/whitelist.git

    0. 作业0(5分)

    ① 修改create.cpp文件,改成由命令行参数确定生成的数据的数据量。

    create.app代码如下

    //create.cpp
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        srand((unsigned)time(NULL));
        //从命令行读取生成数据量的大小
        int n = 10;
        if (argc > 1) { //如果命令行有数据量大小
            n = atoi(argv[1]); //atoi将字符型转成整型
        }
        for (int i = 0; i < n; i++)
        {
            cout << rand() << "
    ";
        }
    
        cout << endl;
    
        return 0;
    }

    ②修改readme.md的对应部分。

    readme.md文档如下:

    readme.md

    #项目名称:白名单统计

    #项目描述:从交易记录q中查找不符合白名单whitelist的非法交易

    #编程语言:C++

    #版本介绍:

       1.V0.1   2020.9.17  数据量大小为固定值

       2.V0.2   2020.9.23  用命令行参数决定生成的数据量的大小

    #使用指南(V0.2):

    1. 安装vs 2017 以上;
    2. 编译create.cpp文件;
    3. 执行“create 10 > whitelist”生成文件whitelist;
    4. 重新编译create.cpp文件;
    5. 执行“create 1000 > q”生成文件q;
    6. 编译brute.cpp文件;
    7. 执行“brute -w whitelist < q > output”。

    #作者:老杨

    1.作业1(10分)

    对上面两段老杨写的代码任选其一进行profile,观察现象(要求有截图记录)。

    答:

    ①原代码存在问题,与代码与修改后的代码相比较为:

    原代码为: 修复后代码为:
    bool is_match(int t, int w[], int w_length)
    {
        for(int i=0;i<w_length;i++)
        {
            if(t!=w[i])
            {
                return true;
            }
        }
        return false;
    }
    bool is_match(int t, int w[], int w_length)
    {
        for (int i = 0; i < w_length; i++)
        {
            if (t == w[i])
            {
                return false;
            }
        }
        return true;
    }

       

      

    需求为:当t与w数组中的任何数都不相等时,则进行输出t。

    思路为:当t与w数组中的任何一个数相等时,则返回false,不进行输出。再判断下一个t,当t与w数组中任何一个数都不相等时,返回true,输出t。依次循环。

    ②本回答对C语言代码进行profile

    选择分析 - > 性能探查器 (勾选CPU使用率)

    当数据量小时,profile如下:

    1) 读入两个文件,一个用控制台,一个用命令行参数指出文件名。

    ① 文件 biggerwhitelist,包含1列整数1M个,随机生成(要求老杨自己想办法),通过命令行参数指出文件名。

    生成文件如下:

    ② 文件 biggerq,包含1列整数10M个,随机生成(也要求老杨自己想办法),通过控制台读入。

    生成文件如下:

    2) 在文件biggerq中查找所有不在biggerwhitelist中的整数,重定向输出到一个文件中。

    3) 写一份如何部署运行代码的readme。

    readme.md

    #项目名称:白名单统计

    #项目描述:从交易记录q中查找不符合白名单whitelist的非法交易

    #编程语言:C++

    #使用指南:

    1. 安装vs 2017 以上;
    2. 编译create.cpp文件;
    3. 命令行执行“create 1000000 > biggerwhitelist”生成文件biggerwhitelist;
    4. 重新编译create.cpp文件;
    5. 控制台执行“create 10000000 > biggerq”生成文件biggerq;
    6. 编译brute.cpp文件;
    7. 命令行执行“brute -w whitelist < q > output”。

      

    2.作业2(10分)

    以biggerwhitelist和biggerq作为输入,对作业1中选择的代码再次进行profile,找到代码执行最“慢”的地方,截图为证并文字说明。

    答:性能分析截图如下

     

    由图可知,在main()函数中的is_match()函数代码执行最“慢”。

    3.根据作业2找到的最慢的地方,优化作业1中你选择的代码,在保证输出结果正确的前提下,减少老杨程序运行的时间。(优化后的代码需要你提交到git上,作为教师的判断依据。优化后的程序的名字应该是better.cpp或者better.cs。)

    代码托管地址如下:https://e.coding.net/zhangbj/whitelist/whitelist.git

    优化后的代码:

    //better.cpp
    #include <fstream>
    #include <iostream>
    #include <cstring>
    #include<algorithm>
    using namespace std;
    
    const int w_1m = 1000000;
    int w[w_1m];
    
    bool is_match(int t, int left, int right, int w[])
    {
        
        //对排序后的有序数据进行二分查找
        while (left <= right)
        {
            int mid = (left + right) / 2;
            if (w[mid] == t) {
    
                return false;
            }
            if (w[mid] < t)
            {
                left = mid + 1;
            }
            if (w[mid] > t)
            {
                right = mid - 1;
            }
        }
        return true;
    }
    
    // brute -w whitelist < T
    int main(int argc, char *argv[])
    {
        if (argc != 3 || strcmp(argv[1], "-w"))
        {
            return 1;
        }
    
        // init w
        ////    for(int i=0;i<w_1m)
        ////    {
        ////        w[i]=-1; //填充非法数据
        ////    }
        ifstream infile;
        infile.open(argv[2]);
        int i = 0;
        cout << argv[2] << endl;
        while (infile >> w[i++])
        {
        }
        int w_length = i - 1;
        cout << w_length << endl;
        // check t
        int t = 0;
    
        sort(w, w + w_length); //使用快排sort函数
        
        while (cin >> t)
        {
            if (is_match(t, 0, w_length,w))
            {
                cout << t << endl;
            }
        }
    }

     4.作业4(5分)

    对作业3优化后的代码进行profile,结果与作业2的结果做对比。画表格并文字说明。

    效果如下:

     

     

     

    表格对比: 

    方法

    main

    CPU所占比

    is_match

    CPU所占比

    burter 99.26% 80.21%
    better 98.69% 6.33%(is_match) + 3*10.68%(sort) = 38.37%

    5.作业5(5分)

    ①你觉得老杨的文档(readme),注释和代码风格又哪些问题,该如何改进?

      readme.md文件写的不够清楚

      注释不详细,未简单清晰

      代码存在中英文符号问题

    ②面试结束了,你和老杨握手,对他说出了面试的结果。你说的内容,不是今天的作业题,也许是若干年以后你想对当年教你的教师说的,也许是你希望未来的面试官对你说的。你想说的是什么呢?

      掌握语言多,基础扎实,欢迎你的加入,希望你在本公司可以继续突破成长。

  • 相关阅读:
    Quartz 基本概念及原理
    quartz-2.2.x 快速入门 (1)
    hive踩过的小坑
    spring profile 多环境配置管理
    win10窗口设置眼睛保护色
    优雅地在markdown插入图片
    Using Spring Boot without the parent POM
    isDebugEnabled作用
    Log 日志级别
    为什么要使用SLF4J而不是Log4J
  • 原文地址:https://www.cnblogs.com/ZhangBingjie/p/13715855.html
Copyright © 2011-2022 走看看