很多答案都談到算法的重要性,我的答案主要集中在C++上,只是一些個(gè)人經(jīng)驗(yàn)。 其實(shí)我以前也有這樣的困惑,感覺完了不知道怎么用。而且我也不是學(xué)計(jì)算機(jī)的,也沒有從事相關(guān)工作,所以大概有十年的時(shí)間都沒寫什么程序。最近因?yàn)橄胱鳇c(diǎn)東西,所以又重新開始寫。 剛開始用的是python,比較好學(xué)。但是因?yàn)樯窠?jīng)網(wǎng)絡(luò)計(jì)算量太大了,用python效率不太夠。后來用matlab寫,matlab也比較方便,矩陣運(yùn)算優(yōu)化得很好,但是太耗內(nèi)存了,我的破機(jī)器沒法處理那么多數(shù)據(jù)。于是后來就開始用C++。 C++是相對(duì)而言比較容易出錯(cuò),我一般碰到問題就去stackoverflow查查,基本上都能找到答案,如果沒有現(xiàn)成的,就問一下,一般半小時(shí)以內(nèi)就會(huì)有人回答,所以總體還是比較方便的。 C++在內(nèi)存管理上有比較大的靈活性,很多時(shí)候程序的效率可以從這里發(fā)掘出來。同樣的算法,因?yàn)榭梢苑奖愕墓芾韮?nèi)存,所以效率會(huì)有很大提高。比如使用指針可以減少不必要的變量復(fù)制,但是指針也容易出問題,所以有些時(shí)候能有替代的,就用替代的,比如傳遞參數(shù)時(shí)可以是引用,遍歷數(shù)組的時(shí)候可以用迭代器等等。這些都可以提高內(nèi)存使用效率,同時(shí)安全性也更高。這樣的問題在python等語言中都是不需要考慮的,因此在大量數(shù)據(jù)和計(jì)算的時(shí)候,python也很難達(dá)到C++的靈活性和效率。 C++的另外一個(gè)特點(diǎn)是語法特征很豐富。因?yàn)楹茇S富所以也很容易搞錯(cuò)。我自己給自己設(shè)定的原則是,如果有簡單的特征就不用復(fù)雜的特征。比如我很少會(huì)用到面向?qū)ο蟮睦^承,因?yàn)槔^承往往會(huì)讓類的層級(jí)變得很復(fù)雜,這時(shí)候如果用模板或者友元可以簡化問題,那就不用復(fù)雜的。不僅是功能要解耦,還要數(shù)據(jù)類型和算法盡可能分離開,設(shè)計(jì)好接口,無論使用C++中哪種范式的語言特征都應(yīng)該以這個(gè)為目標(biāo)。 光自己寫也不行,還是得看看高手的作品。一般開源項(xiàng)目都比較復(fù)雜,水平也參差不齊,文檔也不一定完善。我自己學(xué)習(xí)的過程中看的是SGI STL的代碼,感覺還是很厲害的。侯捷有本書可以作指引。STL作為一個(gè)基礎(chǔ)庫,既要功能強(qiáng)大,又要提高效率,這是多么難的事情。以我這樣的菜鳥水平,只能用大開眼界來形容了吧。 另外,算法雖然很重要,但是很多實(shí)際項(xiàng)目中,算法基本是固定的。再比如大規(guī)模計(jì)算時(shí),要使用到GPU,很多精妙的算法完全用不上,反而越簡單的算法越容易并行化。 所以我感覺,學(xué)習(xí)的重點(diǎn)除了算法,還要注重程序設(shè)計(jì)簡潔清晰,內(nèi)存使用合理,如果有必要還可以針對(duì)具體硬件進(jìn)行優(yōu)化。 大概就這么多了。。 |
|