国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

巧用頭腦思考,提高軟件運行效率-淺談程序算法

2024-07-21 02:19:27
字體:
來源:轉載
供稿:網友
中國最大的web開發資源網站及技術社區,
關于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 中,無疑這樣使用了很多空間! 更郁悶的是如果我們要操作軟件,必須等軟件已經做完上一部分的事才響應我們接下來來操作, 上面的方法會導致我們的軟件有 死機現象 有沒有更好的辦法?


問題就出現我們使用了常規的想法,就差一點自己的改動!

我們仔細想一想,在treeview中,我們想要看見(這里指的看見是指人眼可以看他在樹中)所有接點需要我們用鼠標去展開,當我們沒有展開接點呢(沒有展開接點前有必要就加到樹中嗎)? 上面的算法是一次性的初始化了全部了的接點,只要我們不一次性初始化就可以了!

看下面的方法:

private void form1_load(object sender, system.eventargs e)
{
this.treeview1 .nodes .clear ();
directoryinfo my=new directoryinfo ("c://");
treenode nan=new treenode(@my.fullname);
this.treeview1.nodes.add(nan);
addmytreeview(nan);



}

private void addmytreeview(treenode mnode)
{


try
{
directoryinfo di=new directoryinfo(@mnode.text);
directoryinfo[] atemp=di.getdirectories();
for(int i=0;i<atemp.length ;i++)
{
treenode my2=new treenode (@atemp[i].fullname );
mnode.nodes .add(my2);
//addmytreeview(my2); this is a bad method!
directoryinfo di2=new directoryinfo(@my2.text );
directoryinfo[] atemp2=di2.getdirectories();
for(int j=0;j<atemp2.length ;j++)
{
treenode my3=new treenode (@atemp2[j].fullname );
my2.nodes .add (my3);
}


}
}
catch(exception ex)
{

}

}

private void treeview1_afterselect(object sender, system.windows.forms.treevieweventargs e)
{

e.node.nodes.clear();
this.addmytreeview(e.node);



}

private void treeview1_beforeexpand(object sender, system.windows.forms.treeviewcanceleventargs e)
{
e.node.nodes.clear();
this.addmytreeview(e.node);

}

上面的是我們充分的運用了treeview控件的所有方法 上面的思路如下:
在窗體load的 加入“c://” 接點,然后調用 private void addmytreeview(treenode mnode),但是在這里面用了兩層循環,也就 把 相對于c 盤的 文件加入了兩層,(c盤的文件我們可以看成是一級一級的目錄), 當 afterselect 發生時 這次調用 addmytreeview(treenode mnode) ,當beforeexpand 時清除 接點 仔細比較第種算法,我們可以看出第二種比第一種更方便,第二種也沒有增加什么技術難度,只是 換了一了下思維方式!



你也許會說我第一種方法是有意浪費空間的,當然我只是為做一個有對比的演示,我相信大家還可以在我第二中方法上更加優化!


軟件開發不是簡單的復制和粘貼,更加要思考, 不要輕視小程序的資源問題,也許在對大程序時就可以節約不必要的空間時間浪費!

今天就寫到這了!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 余庆县| 兴城市| 清水河县| 皋兰县| 湘潭市| 邵东县| 贞丰县| 九江市| 武汉市| 嘉善县| 北宁市| 丰城市| 靖边县| 章丘市| 保定市| 上栗县| 无锡市| 泾源县| 垣曲县| 喀什市| 霍邱县| 嘉禾县| 陇川县| 潞城市| 桃源县| 舒城县| 亚东县| 义马市| 新疆| 平谷区| 从江县| 镶黄旗| 西昌市| 策勒县| 基隆市| 锡林郭勒盟| 涞源县| 乃东县| 随州市| 姜堰市| 东丽区|