您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“IronPython和C#執(zhí)行速度比較”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
我構(gòu)思的實驗覆蓋到下面幾個我認為是實際項目中比較有代表性的場景:
1.訪問一個稍大的數(shù)據(jù)表,遍歷所有記錄;
2.生成并操作一個列表;
3.生成并操作一個字典;
4.通過反射動態(tài)加載并調(diào)用一個方法。
C#部分的代碼,編譯時使用了/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)
運行結(jié)果:
對于列表和字典的操作,IronPython比C#慢3到4倍,這是意料之中的事情。沒有想到的是訪問數(shù)據(jù)庫的方法,IronPython竟然比C#還要略快,這是事先無論如何都沒有料到的。原來我以為,數(shù)據(jù)庫訪問代碼基本上是純粹的調(diào)用ADO.Net,瓶頸主要是在數(shù)據(jù)庫那一邊,IronPython在方法調(diào)用的時候應(yīng)該比C#略微慢一點吧,那么總體速度也應(yīng)該稍微慢一點才對。沒想到結(jié)果正好反過來!我也沒有辦法解釋為什么這里IronPython能夠做到比C#還快。不過結(jié)論應(yīng)該很明顯了:訪問數(shù)據(jù)庫的時候,你無需擔(dān)心IronPython不夠快。我們的項目大多數(shù)時候效率瓶頸都是出在數(shù)據(jù)庫上面,至于程序語言快一點還是慢一點通常無關(guān)緊要,更何況這里的結(jié)果表明腳本語言有時候反而可能更快呢。
對于反射的測試,IronPython則是壓倒性的戰(zhàn)勝了C#。需要說明的一點是我在C#中反射生成對象使用的方法是ConstructorInfo.Invoke()。如果換成Activator.CreateInstance()的話,那么C#的時間將會縮減到230~250毫秒,不過即便這樣仍然比IronPython落后一半左右。為什么使用反射時IronPython比C#快這么多呢?或許因為它運行的時候能夠在內(nèi)存中動態(tài)生成部分字節(jié)碼,從而跳過反射環(huán)節(jié),所以更快吧。
從這個實驗的結(jié)果看,IronPython的性能可以說好到超出了我的預(yù)期。因為之前也看過其他一些相關(guān)的性能評測,比如說Ruby要比Java的運行速度慢30倍(這個比較已經(jīng)有一段時間了,現(xiàn)在差距應(yīng)該有所縮?。?,相比之下IronPython的性能簡直可以用十分優(yōu)異來形容了。當然腳本語言也有一個不足的地方,就是加載解釋器的時候會帶來幾秒鐘的固定開銷,頻繁修改程序的時候,這幾秒鐘還是有點讓人難受的。好在以嵌入方式使用IronPython的時候,引擎只需要加載一次就夠了,所以這個缺點大體上還是可以接受的。
“IronPython和C#執(zhí)行速度比較”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。