關於VC# 如何提高運行效率
大家都知道.Net 讓我們開發程序更加的簡單,特別是對與企業性的大型軟件的開發,它和Java一樣運用了GC(垃圾回收) 的機制,有了垃圾回收就可以丟掉在C或C++ 中痛苦的指針, 可以不用花心思去關注內存是不是已經釋放,可以說給程序員減輕了負擔。
我在這不說關於GC是不是好,GC也有它自己的缺點,如已經不必要用的內存不會提前釋放,或多或少的浪費了內存,我不想說C#中采用GC 有多成功,但是從我自己開發的經歷來,C#的效率很讓人失望,同一功能用C++ 實現比C#實現更節約內存,我沒有用C#開發過大的程序,不知道究竟C#對內存的要求有多大,按照我的一程序分析, 有垃圾回收的機制的語言是C++ 的內存的3-20倍,怎麼樣才能提高C#開發的程序的運行效率,怎麼才可以節約空間呢?
縱所周知,算法是程序的核心,我們無法改變語言自己本身特有的,只有從我們算法來著手來想辦法!同樣的能夠可以用不同的思路來實現,所謂條條大路同羅馬,大家都知道,也許我們所缺少的是思考,我們作為程序員 本來就做思考的活動,能為一個問題思考可以說是一件樂事!
下面我說一個例子,關於VC#的使用,對於同一個問題可以使用不同的方法
我們現在面臨的問題如下(假設)
要用TreeVIEw 做一個類似資源浏覽器的東西
說到算法很簡單:就是遍歷電腦裡的文件,並且添加到TreeVIEw 接點中!
一種最簡單的(核心)代碼如下:
private void button1_Click(object sender, System.EventArgs e)
{
try
{
DirectoryInfo ainfo=new DirectoryInfo("C:\\");
TreeNode nan=new TreeNode(ainfo.FullName);
this.treeVIEw1.Nodes.Add(nan);
addNode(nan);
}
catch(System.IO.DirectoryNotFoundException eDnfa)
{
MessageBox.Show(eDnfa.Message);
}
}
private void addNode(TreeNode tn)
{
DirectoryInfo di=new DirectoryInfo(tn.Text);
DirectoryInfo[] aTemp=di.GetDirectorIEs();
if (aTemp.Length>0)
foreach(DirectoryInfo d in aTemp)
{
TreeNode node=new TreeNode(d.FullName);
tn.Nodes.Add(node);
addNode(node);
}
FileInfo[] sFiles=di.GetFiles();
foreach(FileInfo f in sFiles )
{
TreeNode node=new TreeNode(f.FullName);
tn.Nodes.Add(node);
}
}
上面的代碼顯示C盤的全部文件是TREEVIEW中,大家可以分析它執行的先後順序:
button1 的 Click 引發後執行後面的操作,然後調用addNode(TreeNode tn) 方法!仔細看裡面,其實用到了遞歸, 首先是 把“C:\\” 加入到根接點,然後訪問C盤第一個文件夾,加入到樹中,然後訪問C盤第一個文件夾下的第一個文件夾,加入到數中,以次遞歸,當到了盡頭,然後再返回加第而個文件,形象的說是做S形循環! 我無法用圖來說明具體情況,也許比較難理解,我想只要自己仔細思考是可以想出來,我們要永遠記住,程序員這一個職業就是 思考的 職業! 還要創新!
毫無疑問,上面的算法是正確的,但是到最後使用了多少內存呢,全部的接點都加到了TreevIEw 中,無疑這樣使用了很多空間! 更郁悶的是如果我們要操作軟件,必須等軟件已經做完上一部分的事才響應我們接下來來操作, 上面的方法會導致我們的軟件有 死機現象 有沒有更好的辦法?