自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

IronPython和C#執(zhí)行速度對(duì)比

開(kāi)發(fā) 后端
其實(shí)我自己對(duì)執(zhí)行速度這個(gè)問(wèn)題本來(lái)并沒(méi)有什么興趣,因?yàn)橐郧暗慕?jīng)驗(yàn)告訴我:除非是運(yùn)算密集型的程序,否則腳本語(yǔ)言和編譯型語(yǔ)言使用起來(lái)速度沒(méi)有多大差別。但是我們公司有個(gè)人知道我的想法以后,天天在我耳邊嚷嚷腳本運(yùn)行速度太慢,那好吧,讓我用實(shí)驗(yàn)來(lái)說(shuō)服你。不過(guò)這一試,還真的出現(xiàn)了嚇人一跳的結(jié)果。

我構(gòu)思的實(shí)驗(yàn)覆蓋到下面幾個(gè)我認(rèn)為是實(shí)際項(xiàng)目中比較有代表性的場(chǎng)景:

1.訪問(wèn)一個(gè)稍大的數(shù)據(jù)表,遍歷所有記錄;

2.生成并操作一個(gè)列表;

3.生成并操作一個(gè)字典;

4.通過(guò)反射動(dòng)態(tài)加載并調(diào)用一個(gè)方法。

C#部分的代碼,編譯時(shí)使用了/debug-和/optimize+:

Code

  1. usingSystem;  
  2. usingSystem.Data.SqlClient;  
  3. usingSystem.Diagnostics;  
  4. usingSystem.Collections.Generic;  
  5. usingSystem.Reflection;  
  6.  
  7. namespaceTest  
  8. {  
  9. classTest  
  10. {  
  11. publicstaticvoidMain(string[]args)  
  12. {  
  13. Console.WriteLine("C#:");  
  14. Measure(TestDb,"TestDb");  
  15. Measure(TestList,"TestList");  
  16. Measure(TestDict,"TestDict");  
  17. Measure(TestReflection,"TestReflection");  
  18. }  
  19.  
  20. delegatevoidFuncDelegate();  
  21.  
  22. staticvoidMeasure(FuncDelegatefunc,stringfuncName)  
  23. {  
  24. Stopwatchsw=newStopwatch();  
  25. sw.Start();  
  26. func();  
  27. sw.Stop();  
  28. Console.WriteLine("{0}used{1}ms",funcName,sw.ElapsedMilliseconds);  
  29. }  
  30.  
  31. staticvoidTestDb()  
  32. {  
  33. using(SqlConnectionconn=newSqlConnection(connStr))  
  34. {  
  35. conn.Open();  
  36.  
  37. SqlCommandcmd=newSqlCommand(sql,conn);  
  38. SqlDataReaderreader=cmd.ExecuteReader();  
  39. while(reader.Read())  
  40. {  
  41. varid=reader["Id"];  
  42. varcode=reader["Code"];  
  43. varcargoCode=reader["CargoCode"];  
  44. varlength=reader["Length"];  
  45. varwidth=reader["Width"];  
  46. varheight=reader["Height"];  
  47. varvol=reader["Vol"];  
  48. varpallet=reader["Pallet"];  
  49. }  
  50. reader.Close();  
  51. cmd.Dispose();  
  52. conn.Close();  
  53. }  
  54. }  
  55.  
  56. staticvoidTestList()  
  57. {  
  58. varlist=newList();  
  59. constintcount=100000;  
  60. for(inti=0;ilist.Add(string.Format("item{0}",i));  
  61. for(inti=count-1;i>=0;i--)  
  62. list.RemoveAt(i);  
  63. }  
  64.  
  65. staticvoidTestDict()  
  66. {  
  67. vardict=newDictionary();  
  68. constintcount=100000;  
  69. for(inti=0;idict[string.Format("key{0}",i)]=string.Format("value{0}",i);  
  70. for(inti=0;idict.Remove(string.Format("key{0}",i));  
  71. }  
  72.  
  73. staticvoidTestReflection()  
  74. {  
  75. AssemblyAssemblyassem=Assembly.LoadFrom("Lib.dll");  
  76. Typetype=assem.GetType("Lib.TestLib");  
  77. constintcount=100000;  
  78. ConstructorInfoci=type.GetConstructor(Type.EmptyTypes);  
  79. MethodInfomi=type.GetMethod("GetMessage");  
  80. for(inti=0;i{  
  81. objectobj=ci.Invoke(null);//Activator.CreateInstance(type);  
  82. mi.Invoke(obj,newobject[]{"name"});  
  83. }  
  84. }  
  85.  
  86. conststringconnStr="IntegratedSecurity=SSPI;InitialCatalog=test;DataSource=.";  
  87.  
  88. conststringsql="select*fromCargoPackageTypes";  
  89. }  

IronPython部分的代碼:

Code

  1. from__future__importwith_statement  
  2. importclr,sys  
  3. clr.AddReference('System.Data')  
  4. fromSystem.Data.SqlClientimportSqlCommand,SqlConnection  
  5. fromSystem.DiagnosticsimportStopwatch  
  6. fromSystem.ReflectionimportAssembly  
  7.  
  8. connStr="IntegratedSecurity=SSPI;InitialCatalog=test;DataSource=.";  
  9.  
  10. sql="select*fromCargoPackageTypes";  
  11.  
  12. deftestDb():  
  13. withSqlConnection(connStr)asconn:  
  14. conn.Open()  
  15.  
  16. cmd=SqlCommand(sql,conn)  
  17. reader=cmd.ExecuteReader()  
  18. whilereader.Read():  
  19. id=reader["Id"]  
  20. code=reader["Code"]  
  21. cargoCode=reader["CargoCode"]  
  22. length=reader["Length"]  
  23. width=reader["Width"]  
  24. height=reader["Height"]  
  25. vol=reader["Vol"]  
  26. pallet=reader["Pallet"]  
  27. reader.Close()  
  28. cmd.Dispose()  
  29. conn.Close()  
  30. deftestList():  
  31. lst=[]  
  32. count=100000 
  33. foriinxrange(count):  
  34. lst.append('item%d'%i)  
  35. foriinxrange(count-1,-1,-1):  
  36. lst.pop(i)  
  37. deftestDict():  
  38. d={}  
  39. count=100000 
  40. foriinxrange(count):  
  41. d['key%d'%i]='value%d'%i  
  42. foriinxrange(count):  
  43. d.pop('key%d'%i)  
  44. deftestReflection():  
  45. clr.AddReferenceToFile('Lib.dll')  
  46. fromLibimportTestLib  
  47. count=100000 
  48. foriinxrange(count):  
  49. obj=TestLib()  
  50. obj.GetMessage('name')  
  51. defmeasure(fn):  
  52. sw=Stopwatch()  
  53. sw.Start()  
  54. fn()  
  55. sw.Stop()  
  56. print'%sused%sms'%(fn.__name__,sw.ElapsedMilliseconds)  
  57. print'Python:'  
  58. measure(testDb)  
  59. measure(testList)  
  60. measure(testDict)  
  61. measure(testReflection) 

運(yùn)行結(jié)果:

運(yùn)行結(jié)果

對(duì)于列表和字典的操作,IronPython比C#慢3到4倍,這是意料之中的事情。沒(méi)有想到的是訪問(wèn)數(shù)據(jù)庫(kù)的方法,IronPython竟然比C#還要略快,這是事先無(wú)論如何都沒(méi)有料到的。原來(lái)我以為,數(shù)據(jù)庫(kù)訪問(wèn)代碼基本上是純粹的調(diào)用ADO.Net,瓶頸主要是在數(shù)據(jù)庫(kù)那一邊,IronPython在方法調(diào)用的時(shí)候應(yīng)該比C#略微慢一點(diǎn)吧,那么總體速度也應(yīng)該稍微慢一點(diǎn)才對(duì)。沒(méi)想到結(jié)果正好反過(guò)來(lái)!我也沒(méi)有辦法解釋為什么這里IronPython能夠做到比C#還快。不過(guò)結(jié)論應(yīng)該很明顯了:訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,你無(wú)需擔(dān)心IronPython不夠快。我們的項(xiàng)目大多數(shù)時(shí)候效率瓶頸都是出在數(shù)據(jù)庫(kù)上面,至于程序語(yǔ)言快一點(diǎn)還是慢一點(diǎn)通常無(wú)關(guān)緊要,更何況這里的結(jié)果表明腳本語(yǔ)言有時(shí)候反而可能更快呢。

對(duì)于反射的測(cè)試,IronPython則是壓倒性的戰(zhàn)勝了C#。需要說(shuō)明的一點(diǎn)是我在C#中反射生成對(duì)象使用的方法是ConstructorInfo.Invoke()。如果換成Activator.CreateInstance()的話(huà),那么C#的時(shí)間將會(huì)縮減到230~250毫秒,不過(guò)即便這樣仍然比IronPython落后一半左右。為什么使用反射時(shí)IronPython比C#快這么多呢?或許因?yàn)樗\(yùn)行的時(shí)候能夠在內(nèi)存中動(dòng)態(tài)生成部分字節(jié)碼,從而跳過(guò)反射環(huán)節(jié),所以更快吧。

從這個(gè)實(shí)驗(yàn)的結(jié)果看,IronPython的性能可以說(shuō)好到超出了我的預(yù)期。因?yàn)橹耙部催^(guò)其他一些相關(guān)的性能評(píng)測(cè),比如說(shuō)Ruby要比Java的運(yùn)行速度慢30倍(這個(gè)比較已經(jīng)有一段時(shí)間了,現(xiàn)在差距應(yīng)該有所縮?。?,相比之下IronPython的性能簡(jiǎn)直可以用十分優(yōu)異來(lái)形容了。當(dāng)然腳本語(yǔ)言也有一個(gè)不足的地方,就是加載解釋器的時(shí)候會(huì)帶來(lái)幾秒鐘的固定開(kāi)銷(xiāo),頻繁修改程序的時(shí)候,這幾秒鐘還是有點(diǎn)讓人難受的。好在以嵌入方式使用IronPython的時(shí)候,引擎只需要加載一次就夠了,所以這個(gè)缺點(diǎn)大體上還是可以接受的。

【編輯推薦】

  1. C#中使用位運(yùn)算來(lái)實(shí)現(xiàn)權(quán)限管理
  2. 淺談C#如何實(shí)現(xiàn)多繼承
  3. 淺談C#基元類(lèi)型及常見(jiàn)問(wèn)題解答
  4. C#語(yǔ)言與Java語(yǔ)言程序的比較
  5. 利用C#指針進(jìn)行圖像操作
責(zé)任編輯:彭凡 來(lái)源: cnblogs
相關(guān)推薦

2010-04-27 18:54:06

AIX語(yǔ)言

2025-03-17 03:00:00

C#性能并行處理

2009-08-17 16:34:21

.NET分布式緩存Memcached

2009-08-28 17:18:55

foreach循環(huán)

2009-04-28 10:23:58

VB.NETC#對(duì)比

2009-09-07 10:37:32

C#執(zhí)行Finaliz

2023-05-10 08:29:12

2018-08-02 16:17:34

Python 開(kāi)發(fā)編程語(yǔ)言

2009-08-18 14:14:45

C#擴(kuò)展方法性能測(cè)試

2022-02-09 07:13:52

C盤(pán)爆滿(mǎn)存儲(chǔ)文件硬盤(pán)

2011-07-04 10:19:41

索引ONLINE

2009-08-17 10:54:53

C#執(zhí)行ping命令

2009-08-13 17:04:09

C#語(yǔ)言C#程序

2009-08-27 16:11:03

C# delegateC# event

2009-08-06 09:32:03

C#代碼協(xié)同執(zhí)行

2009-10-15 09:32:39

什么是IronPythPython.NET

2009-09-07 15:21:38

Java與C#事件處理

2009-08-11 09:10:26

Windows 7系統(tǒng)提速

2023-07-06 14:49:44

PandasPolars語(yǔ)法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)