wf效能分析
Posted 袁玥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wf效能分析相关的知识,希望对你有一定的参考价值。
听从了老师的建议我请教了其他的同学,修改了代码实现了功能四,以下是我的效能测试:
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秒。
以上是关于wf效能分析的主要内容,如果未能解决你的问题,请参考以下文章