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效能分析