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

    此作业要求详见[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11207]

    作业0(5分)

    修改create.cpp文件,改成由命令行参数确定生成的数据的数据量。修改readme.md的对应部分。(要求贴出修改之后的代码和read.md。)

    //create.cpp
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        int num = atoi(argv[1]);
        srand((unsigned)time(NULL));
        for (int i = 0; i < num; i++)
        {
            cout << rand();
            if(i!=num-1) cout << "
    ";
        }
        cout << endl;
    
        return 0;
    }
    ReadMe.md
    1,项目名称:白名单
    模块构成:
    (1)create创建测试用例
    (2)brute 通过白名单过滤数据
    2,安装环境 Visual Studio 2015以上(包含C++,C#语言模块)
    3,简要使用说明
    (1)下载并安装vs;
    (2)配置环境变量;
    (3)编译create.cpp文件;
    (4)执行“create 10>whitelist"生成白名单文件whitelist
    (5)执行“create 1000>q”生成测试文件q;
    (6)编译brute.cs文件;
    (7)执行“brute -w whitelist < q > output”


    作业1(10分) 

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

     我选择对brute程序C#版本进行profile。

    首先使用VS2019自带的性能探查器进行CPU性能分析。

     接着等待程序执行完成,执行结果如下:

     很容易的发现System.Console.WriteLine(int)占用了很大一部分CPU导致运行缓慢。

    作业2(10分)

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

     对作业1中修改数据后再次profile。

     发现System.Console.WriteLine(int)占用了程序80%的CPU资源,所以源代码中Console.WriteLine占用很大一部分时间,对应代码位置如下:

    for(int i = 1;i < sm.Length; ++i)
    {
         int temp = Convert.ToInt32(sm[i]);
         if(find(temp, array) == -1)
                Console.WriteLine(temp); 
    }
    

      

    作业3(10分)

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

    项目地址:https://thinkget.coding.net/public/wf/whitelist/git(https://e.coding.net/thinkget/wf/whitelist.git)

     控制台输出再写入文件是一件很“费力”的事情,所以直接不使用控制台输出,把结果写到数组中用文件输出可以大幅度减少时间。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace profiletest
    {
        class Better
        {
            static void Main(string[] args)
            {
                DateTime beforDT = System.DateTime.Now;
                if (args.Count() < 1) return;
                string path = args[1];
                string[] sm = File.ReadAllLines(path);
                int[] p = new int[sm.Length];
                for (int i = 0; i < sm.Length; i++)
                {
                    p[i] = Convert.ToInt32(sm[i]);
                }
                //Console.WriteLine(sm.Length);
                string[] sj = new string[10000000];//修改:添加存放的数组
                int sjflag = 0;
                int a = Console.Read();
                string num = "";
                for (int i = 0; i < 10000000; i++)
                {
                    int tempnum = Convert.ToInt32(Console.ReadLine());
                    if (find(tempnum, p) == -1)
                        sj[sjflag++] = num;//修改:使用数组存储数据
                }
                sj = sj.Where(s => !string.IsNullOrEmpty(s)).ToArray();
                File.WriteAllLines("output", sj, Encoding.UTF8);//修改:将数据存放到output文件
                DateTime afterDT = System.DateTime.Now;
                TimeSpan ts = afterDT.Subtract(beforDT);
                Console.WriteLine("DateTime: {0}ms.", ts.TotalMilliseconds);
            }
    
            static int find(int key, int[] array)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (key == array[j])
                        return key;
                }
                return -1;
            }
        }
    }
    

      

    作业4(5分)

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

     

     对作业3进行profile,发现输入语句和类型转换语句占用大部分时间,由于要求的限制,输入方面暂时没有好的优化方案。对于类型转换,由于水平不高也无法进行优化。

     

     时间方面从原来的十几分钟到现在的几秒钟,提升98%以上

    做业5(5分)

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

    readme方面需要写的更加详细一点,如程序名称,功能的介绍等,还要加上运行环境,方便别人进行安装调试。操作步骤也可以再写详细一点,最后还要说明一些会遇到的问题等等。

    注释方面尽量使用中文介绍程序的功能,方便后来的程序员能快速读懂程序意思

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

    宝剑锋从磨砺出,梅花香自苦寒来。大侠仍需努力提高自己,才能剑走偏锋,出人头地。

  • 相关阅读:
    NOIP201208同余方程
    NOIP模拟赛 最佳组合
    NOIP模拟赛 拓展
    CF1253E Antenna Coverage(DP)
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
    CF582E Boolean Function(DP,状态压缩,FMT)
    CF750G New Year and Binary Tree Paths(DP)
    Codeforces Round 596 题解
    AGC008E Next or Nextnext(组合计数,神奇思路)
    ARC082E ConvexScore(神奇思路)
  • 原文地址:https://www.cnblogs.com/thinkget/p/13700992.html
Copyright © 2011-2022 走看看