1. 程式人生 > >wf效能分析

wf效能分析

use new ++ 執行 編譯 -1 arr i++ spa

聽從了老師的建議我請教了其他的同學,修改了代碼實現了功能四,以下是我的效能測試:

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