听从了老师的建议我请教了其他的同学,修改了代码实现了功能四,以下是我的效能测试:
1.采用ptime.exe测试的3次截图
可以看到的是三次执行时间分别为:1.449秒;0.915秒;0.871秒,取平均值为1.078秒
源码地址:https://coding.net/u/yuanyue2017102885/p/wf-part420170926/git
2.采用vs进行效能测试(vs2008无此功能)
要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化 (或考虑到优化,因此更差的代码没有写出) 。
答:我认为如果要再次提升运行速度,应该对哈希表处有所改进;看了其他同学的作业,我发现我的程序运行的算是比较快的,原因可能是因为我直接把要测试文档的路径写在了程序里面,但是这样做的缺点就是路径明确,如果其他同学在他们的环境下测试有可能出现找不到文件的情况。
要求2 通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图。 (5分)
答:在程序运行中最花费时间的是main函数(因为我的程序中就一个函数。。。)最耗费时间的应该是哈希表部分,代码片段如下:
static void Main(string[] args) { StreamReader ioInput = null; ioInput = new StreamReader(Console.OpenStandardInput()); string textFileName; Console.Write(">type "); textFileName = Console.ReadLine(); StreamReader sreader = new StreamReader(@"C:\Users\dell-pc\desktop\test2.txt"); string afile = sreader.ReadToEnd(); afile = afile.ToLower();//转换为小写字母 //将空格跟标点符号定义出来 char[] c = { ‘ ‘, ‘,‘, ‘.‘, ‘?‘, ‘!‘, ‘:‘, ‘;‘, ‘\‘‘, ‘\"‘ }; //分隔char[c]后产生的数组 string[] S = afile.Split(c); //建立哈希表 Hashtable ha = new Hashtable(); for (int i = 0; i < S.Length; i++) { if (ha.ContainsKey(S[i])) { ha[S[i]] = (int)ha[S[i]] + 1; } else { ha.Add(S[i], 1); } } string[] arrKey = new string[ha.Count];//存键 int[] arrValue = new int[ha.Count];//存值 ha.Keys.CopyTo(arrKey, 0); ha.Values.CopyTo(arrValue, 0); Console.WriteLine(); Console.WriteLine(">wf -s test.txt"); Console.WriteLine("total " + ha.Count); Console.WriteLine(); Array.Sort(arrValue, arrKey);//排序 int n = 0; for (int i = arrKey.Length - 1; i >= 0; i--) { if ((string)arrKey[i] != "") { if (n < 10) { //输出前10位多的单词,右对齐 Console.Write(arrKey[i].ToString().PadRight(12)); Console.WriteLine(arrValue[i].ToString()); n = n + 1; } } } }
要求3 根据瓶颈,"尽力而为"地优化程序性能。 (5分)
答:我觉得自己的程序是比较简洁的,除了输入输出就是主要排序的哈希表部分了,每一条代码都有自己的功能而且我觉得已经无法压缩了。
要求4 再次 profile,给出在 要求1 中的最花费时间的3个函数此时的花费。要求包括截图。(2分)
答:在这篇博文的最开始已经附上了截图,我还求了个平均值1.078s。
要求5 程序运行时间。根据在教师的机器 (Windows8.1) 上运行的速度排名,分为3档。此题得分,第1档20分, 第2档10分,第3档5分。功能测试不能通过的,0分。(20分)
答:源码地址:https://coding.net/u/yuanyue2017102885/p/wf-part420170926/git
里面有一个program.cs的源码与consoleapplication2.exe的编译文件,它们是匹配的。
附加:考虑到我的程序是将原路径写在了代码里,这样老师在运行的时候肯定找不到原路径,这样我就没分了,所以我刚才对代码进行了一点修改,使得灵活性更高,但是在进行ptime测试的发现时间比刚才慢了好多,附上我改后的代码,coding.net里面的.cs文件跟.exe文件我也会重新上传,重新测的运行时间如下:
using System; //using System.Collections.Generic; //using System.Linq; using System.Text; using System.IO; using System.Collections; //using System.Text.RegularExpressions; //using System.Diagnostics; //using System.ComponentModel; namespace wf { class Program { static void Main(string[] args) { StreamReader ioInput = null; ioInput = new StreamReader(Console.OpenStandardInput()); string textFileName; Console.Write(">type "); textFileName = Console.ReadLine(); string url = System.IO.Path.GetFullPath(textFileName+".txt"); StreamReader sreader = new StreamReader(url); //StreamReader sreader = new StreamReader(@"C:\Users\dell-pc\desktop\test2.txt"); string afile = sreader.ReadToEnd(); afile = afile.ToLower();//转换为小写字母 //将空格跟标点符号定义出来 char[] c = { ‘ ‘, ‘,‘, ‘.‘, ‘?‘, ‘!‘, ‘:‘, ‘;‘, ‘\‘‘, ‘\"‘ }; //分隔char[c]后产生的数组 string[] S = afile.Split(c); //建立哈希表 Hashtable ha = new Hashtable(); for (int i = 0; i < S.Length; i++) { if (ha.ContainsKey(S[i])) { ha[S[i]] = (int)ha[S[i]] + 1; } else { ha.Add(S[i], 1); } } string[] arrKey = new string[ha.Count];//存键 int[] arrValue = new int[ha.Count];//存值 ha.Keys.CopyTo(arrKey, 0); ha.Values.CopyTo(arrValue, 0); Console.WriteLine(); Console.WriteLine(">wf -s >" + textFileName + ".txt"); Console.WriteLine("total " + ha.Count); Console.WriteLine(); Array.Sort(arrValue, arrKey);//排序 int n = 0; for (int i = arrKey.Length - 1; i >= 0; i--) { if ((string)arrKey[i] != "") { if (n < 10) { //输出前10位多的单词,右对齐 Console.Write(arrKey[i].ToString().PadRight(12)); Console.WriteLine(arrValue[i].ToString()); n = n + 1; } } } } } }
删除了一些不必要的引用集,首测6秒多,我继续进行测试选取了其中速度比较快的3组测试数据,分别为:1.620秒;1.968秒;1.369秒。