张兵杰 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() << "\n";
    }

    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文件写的不够清楚

  注释不详细,未简单清晰

  代码存在中英文符号问题

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

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

posted @ 2020-09-23 10:17  冰冰子~  阅读(155)  评论(2编辑  收藏  举报