溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

IronPython和C#執(zhí)行速度比較

發(fā)布時間:2021-07-13 18:38:01 來源:億速云 閱讀:350 作者:chen 欄目:編程語言

本篇內(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#執(zhí)行速度比較

對于列表和字典的操作,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ì)量的實用文章!

向AI問一下細節(jié)

免責(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)容。

AI