此作业的要求参见 :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.作业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++ #使用指南:
|
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文件写的不够清楚
注释不详细,未简单清晰
代码存在中英文符号问题
②面试结束了,你和老杨握手,对他说出了面试的结果。你说的内容,不是今天的作业题,也许是若干年以后你想对当年教你的教师说的,也许是你希望未来的面试官对你说的。你想说的是什么呢?
掌握语言多,基础扎实,欢迎你的加入,希望你在本公司可以继续突破成长。