本篇內(nèi)容介紹了“IronPython和C#執(zhí)行速度比較”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評(píng)估等整套的建站服務(wù),主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,App定制開發(fā)以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。創(chuàng)新互聯(lián)公司深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
我構(gòu)思的實(shí)驗(yàn)覆蓋到下面幾個(gè)我認(rèn)為是實(shí)際項(xiàng)目中比較有代表性的場(chǎng)景:
1.訪問一個(gè)稍大的數(shù)據(jù)表,遍歷所有記錄;
2.生成并操作一個(gè)列表;
3.生成并操作一個(gè)字典;
4.通過反射動(dòng)態(tài)加載并調(diào)用一個(gè)方法。
C#部分的代碼,編譯時(shí)使用了/debug-和/optimize+:
Code
usingSystem; usingSystem.Data.SqlClient; usingSystem.Diagnostics; usingSystem.Collections.Generic; usingSystem.Reflection; namespaceTest { classTest { publicstaticvoidMain(string[]args) { Console.WriteLine("C#:"); Measure(TestDb,"TestDb"); Measure(TestList,"TestList"); Measure(TestDict,"TestDict"); Measure(TestReflection,"TestReflection"); } delegatevoidFuncDelegate(); staticvoidMeasure(FuncDelegatefunc,stringfuncName) { Stopwatchsw=newStopwatch(); sw.Start(); func(); sw.Stop(); Console.WriteLine("{0}used{1}ms",funcName,sw.ElapsedMilliseconds); } staticvoidTestDb() { using(SqlConnectionconn=newSqlConnection(connStr)) { conn.Open(); SqlCommandcmd=newSqlCommand(sql,conn); SqlDataReaderreader=cmd.ExecuteReader(); while(reader.Read()) { varid=reader["Id"]; varcode=reader["Code"]; varcargoCode=reader["CargoCode"]; varlength=reader["Length"]; varwidth=reader["Width"]; varheight=reader["Height"]; varvol=reader["Vol"]; varpallet=reader["Pallet"]; } reader.Close(); cmd.Dispose(); conn.Close(); } } staticvoidTestList() { varlist=newList(); constintcount=100000; for(inti=0;ilist.Add(string.Format("item{0}",i)); for(inti=count-1;i>=0;i--) list.RemoveAt(i); } staticvoidTestDict() { vardict=newDictionary(); constintcount=100000; for(inti=0;idict[string.Format("key{0}",i)]=string.Format("value{0}",i); for(inti=0;idict.Remove(string.Format("key{0}",i)); } staticvoidTestReflection() { AssemblyAssemblyassem=Assembly.LoadFrom("Lib.dll"); Typetype=assem.GetType("Lib.TestLib"); constintcount=100000; ConstructorInfoci=type.GetConstructor(Type.EmptyTypes); MethodInfomi=type.GetMethod("GetMessage"); for(inti=0;i{ objectobj=ci.Invoke(null);//Activator.CreateInstance(type); mi.Invoke(obj,newobject[]{"name"}); } } conststringconnStr="IntegratedSecurity=SSPI;InitialCatalog=test;DataSource=."; conststringsql="select*fromCargoPackageTypes"; } }IronPython部分的代碼:
Code
from__future__importwith_statement importclr,sys clr.AddReference('System.Data') fromSystem.Data.SqlClientimportSqlCommand,SqlConnection fromSystem.DiagnosticsimportStopwatch fromSystem.ReflectionimportAssembly connStr="IntegratedSecurity=SSPI;InitialCatalog=test;DataSource=."; sql="select*fromCargoPackageTypes"; deftestDb(): withSqlConnection(connStr)asconn: conn.Open() cmd=SqlCommand(sql,conn) reader=cmd.ExecuteReader() whilereader.Read(): id=reader["Id"] code=reader["Code"] cargoCode=reader["CargoCode"] length=reader["Length"] width=reader["Width"] height=reader["Height"] vol=reader["Vol"] pallet=reader["Pallet"] reader.Close() cmd.Dispose() conn.Close() deftestList(): lst=[] count=100000 foriinxrange(count): lst.append('item%d'%i) foriinxrange(count-1,-1,-1): lst.pop(i) deftestDict(): d={} count=100000 foriinxrange(count): d['key%d'%i]='value%d'%i foriinxrange(count): d.pop('key%d'%i) deftestReflection(): clr.AddReferenceToFile('Lib.dll') fromLibimportTestLib count=100000 foriinxrange(count): obj=TestLib() obj.GetMessage('name') defmeasure(fn): sw=Stopwatch() sw.Start() fn() sw.Stop() print'%sused%sms'%(fn.__name__,sw.ElapsedMilliseconds) print'Python:' measure(testDb) measure(testList) measure(testDict) measure(testReflection)運(yùn)行結(jié)果:

對(duì)于列表和字典的操作,IronPython比C#慢3到4倍,這是意料之中的事情。沒有想到的是訪問數(shù)據(jù)庫(kù)的方法,IronPython竟然比C#還要略快,這是事先無論如何都沒有料到的。原來我以為,數(shù)據(jù)庫(kù)訪問代碼基本上是純粹的調(diào)用ADO.Net,瓶頸主要是在數(shù)據(jù)庫(kù)那一邊,IronPython在方法調(diào)用的時(shí)候應(yīng)該比C#略微慢一點(diǎn)吧,那么總體速度也應(yīng)該稍微慢一點(diǎn)才對(duì)。沒想到結(jié)果正好反過來!我也沒有辦法解釋為什么這里IronPython能夠做到比C#還快。不過結(jié)論應(yīng)該很明顯了:訪問數(shù)據(jù)庫(kù)的時(shí)候,你無需擔(dān)心IronPython不夠快。我們的項(xiàng)目大多數(shù)時(shí)候效率瓶頸都是出在數(shù)據(jù)庫(kù)上面,至于程序語言快一點(diǎn)還是慢一點(diǎn)通常無關(guān)緊要,更何況這里的結(jié)果表明腳本語言有時(shí)候反而可能更快呢。
對(duì)于反射的測(cè)試,IronPython則是壓倒性的戰(zhàn)勝了C#。需要說明的一點(diǎn)是我在C#中反射生成對(duì)象使用的方法是ConstructorInfo.Invoke()。如果換成Activator.CreateInstance()的話,那么C#的時(shí)間將會(huì)縮減到230~250毫秒,不過即便這樣仍然比IronPython落后一半左右。為什么使用反射時(shí)IronPython比C#快這么多呢?或許因?yàn)樗\(yùn)行的時(shí)候能夠在內(nèi)存中動(dòng)態(tài)生成部分字節(jié)碼,從而跳過反射環(huán)節(jié),所以更快吧。
從這個(gè)實(shí)驗(yàn)的結(jié)果看,IronPython的性能可以說好到超出了我的預(yù)期。因?yàn)橹耙部催^其他一些相關(guān)的性能評(píng)測(cè),比如說Ruby要比Java的運(yùn)行速度慢30倍(這個(gè)比較已經(jīng)有一段時(shí)間了,現(xiàn)在差距應(yīng)該有所縮小),相比之下IronPython的性能簡(jiǎn)直可以用十分優(yōu)異來形容了。當(dāng)然腳本語言也有一個(gè)不足的地方,就是加載解釋器的時(shí)候會(huì)帶來幾秒鐘的固定開銷,頻繁修改程序的時(shí)候,這幾秒鐘還是有點(diǎn)讓人難受的。好在以嵌入方式使用IronPython的時(shí)候,引擎只需要加載一次就夠了,所以這個(gè)缺點(diǎn)大體上還是可以接受的。
“IronPython和C#執(zhí)行速度比較”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
分享標(biāo)題:IronPython和C#執(zhí)行速度比較
瀏覽地址:http://chinadenli.net/article24/jigpje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、搜索引擎優(yōu)化、、域名注冊(cè)、定制網(wǎng)站、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)