IronPython和C#執行速度對比

其實我自己對執行速度這個問題本來并沒有什么興趣,因為以前的經驗告訴我:除非是運算密集型的程序,否則腳本語言和編譯型語言使用起來速度沒有多大差別。但是我們公司有個人知道我的想法以后,天天在我耳邊嚷嚷腳本運行速度太慢,那好吧,讓我用實驗來說服你。不過這一試,還真的出現了嚇人一跳的結果。

我構思的實驗覆蓋到下面幾個我認為是實際項目中比較有代表性的場景:

1. 訪問一個稍大的數據表,遍歷所有記錄;

2. 生成并操作一個列表;

3. 生成并操作一個字典;

4. 通過反射動態加載并調用一個方法。

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

ContractedBlock.gifExpandedBlockStart.gifCode
using?System;
using?System.Data.SqlClient;
using?System.Diagnostics;
using?System.Collections.Generic;
using?System.Reflection;

namespace?Test
{
????
class?Test
????{
????????
public?static?void?Main(string[]?args)
????????{
????????????Console.WriteLine(
"C#:");
????????????Measure(TestDb,?
"TestDb");
????????????Measure(TestList,?
"TestList");
????????????Measure(TestDict,?
"TestDict");
????????????Measure(TestReflection,?
"TestReflection");
????????}
????????
????????
delegate?void?FuncDelegate();
????????
????????
static?void?Measure(FuncDelegate?func,?string?funcName)
????????{
????????????Stopwatch?sw?
=?new?Stopwatch();
????????????sw.Start();
????????????func();
????????????sw.Stop();
????????????Console.WriteLine(
"????{0}?used?{1}?ms",?funcName,?sw.ElapsedMilliseconds);
????????}
????????
????????
static?void?TestDb()
????????{
????????????
using?(SqlConnection?conn?=?new?SqlConnection(connStr))
????????????{
????????????????conn.Open();
????????????????
????????????????SqlCommand?cmd?
=?new?SqlCommand(sql,?conn);
????????????????SqlDataReader?reader?
=?cmd.ExecuteReader();
????????????????
while?(reader.Read())
????????????????{
????????????????????var?id?
=?reader["Id"];
????????????????????var?code?
=?reader["Code"];
????????????????????var?cargoCode?
=?reader["CargoCode"];
????????????????????var?length?
=?reader["Length"];
????????????????????var?width?
=?reader["Width"];
????????????????????var?height?
=?reader["Height"];
????????????????????var?vol?
=?reader["Vol"];
????????????????????var?pallet?
=?reader["Pallet"];
????????????????}
????????????????reader.Close();
????????????????cmd.Dispose();
????????????????conn.Close();
????????????}
????????}
????????
????????
static?void?TestList()
????????{
????????????var?list?
=?new?List<string>();
????????????
const?int?count?=?100000;
????????????
for?(int?i=0;?i<count;?i++)
????????????????list.Add(
string.Format("item{0}",?i));
????????????
for?(int?i=count-1;?i>=0;?i--)
????????????????list.RemoveAt(i);
????????}
????????
????????
static?void?TestDict()
????????{
????????????var?dict?
=?new?Dictionary<string,?string>();
????????????
const?int?count?=?100000;
????????????
for?(int?i=0;?i<count;?i++)
????????????????dict[
string.Format("key{0}",?i)]?=?string.Format("value{0}",?i);
????????????
for?(int?i=0;?i<count;?i++)
????????????????dict.Remove(
string.Format("key{0}",?i));
????????}
????????
????????
static?void?TestReflection()
????????{
????????????Assembly?assem?
=?Assembly.LoadFrom("Lib.dll");
????????????Type?type?
=?assem.GetType("Lib.TestLib");
????????????
const?int?count?=?100000;
????????????ConstructorInfo?ci?
=?type.GetConstructor(Type.EmptyTypes);
????????????MethodInfo?mi?
=?type.GetMethod("GetMessage");
????????????
for?(int?i=0;?i<count;?i++)
????????????{
????????????????
object?obj?=?ci.Invoke(null);?//?Activator.CreateInstance(type);?
????????????????mi.Invoke(obj,?new?object[]?{?"name"?}?);
????????????}
????????}
????????
????????
const?string?connStr?=?"Integrated?Security=SSPI;?Initial?Catalog=test;?Data?Source=.";
????????
????????
const?string?sql?=?"select?*?from?CargoPackageTypes";
????}
}

?IronPython部分的代碼:

ContractedBlock.gifExpandedBlockStart.gifCode
from?__future__?import?with_statement
import?clr,?sys
clr.AddReference(
'System.Data')
from?System.Data.SqlClient?import?SqlCommand,?SqlConnection
from?System.Diagnostics?import?Stopwatch
from?System.Reflection?import?Assembly

connStr?
=?"Integrated?Security=SSPI;?Initial?Catalog=test;?Data?Source=.";

sql?
=?"select?*?from?CargoPackageTypes";

def?testDb():
????with?SqlConnection(connStr)?as?conn:
????????conn.Open()
????????
????????cmd?
=?SqlCommand(sql,?conn)
????????reader?
=?cmd.ExecuteReader()
????????
while?reader.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()


def?testList():
????lst?
=?[]
????count?
=?100000
????
for?i?in?xrange(count):
????????lst.append(
'item%d'?%?i)
????
for?i?in?xrange(count-1,?-1,?-1):
????????lst.pop(i)


def?testDict():
????d?
=?{}
????count?
=?100000
????
for?i?in?xrange(count):
????????d[
'key%d'?%?i]?=?'value%d'?%?i
????
for?i?in?xrange(count):
????????d.pop(
'key%d'?%?i)
????????
//www.elivn.com
def?testReflection():
????clr.AddReferenceToFile(
'Lib.dll')
????
from?Lib?import?TestLib
????count?
=?100000
????
for?i?in?xrange(count):
????????obj??
=?TestLib()
????????obj.GetMessage(
'name')
????????
????????
def?measure(fn):
????sw?
=?Stopwatch()
????sw.Start()
????fn()
????sw.Stop()
????
print?'????%s?used?%s?ms'?%?(fn.__name__,?sw.ElapsedMilliseconds)
????

print?'Python:'????
measure(testDb)
measure(testList)
measure(testDict)
measure(testReflection)

?運行結果:

?o_cs.vs.ipy.jpg

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

?對于反射的測試,IronPython則是壓倒性的戰勝了C#。需要說明的一點是我在C#中反射生成對象使用的方法是ConstructorInfo.Invoke()。如果換成Activator.CreateInstance()的話,那么C#的時間將會縮減到230~250毫秒,不過即便這樣仍然比IronPython落后一半左右。為什么使用反射時IronPython比C#快這么多呢?或許因為它運行的時候能夠在內存中動態生成部分字節碼,從而跳過反射環節,所以更快吧。

從這個實驗的結果看,IronPython的性能可以說好到超出了我的預期。因為之前也看過其他一些相關的性能評測,比如說Ruby要比Java的運行速度慢30倍(這個比較已經有一段時間了,現在差距應該有所縮小),相比之下IronPython的性能簡直可以用十分優異來形容了。當然腳本語言也有一個不足的地方,就是加載解釋器的時候會帶來幾秒鐘的固定開銷,頻繁修改程序的時候,這幾秒鐘還是有點讓人難受的。好在以嵌入方式使用IronPython的時候,引擎只需要加載一次就夠了,所以這個缺點大體上還是可以接受的。

?補充: 經網友提醒,數據庫緩存實際上對測試結果有一定影響,執行相同的sql語句兩次(雖然是在兩個進程),后一次總是比前一次稍微快一點,不論使用何種語言。通過改變C#和IronPython測試順序以后的結果來看,可以認為數據庫訪問,C#和IronPython的性能基本上是沒有什么差別的。

轉載于:https://www.cnblogs.com/seoxs/archive/2011/04/21/2023492.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于超級賬本Fabric的供應鏈跟蹤解決方案【開源】

2019獨角獸企業重金招聘Python工程師標準>>> 本項目為基于Hyperledger Fabric區塊鏈的供應鏈資產跟蹤解決方案&#xff0c;項目主要包括鏈碼和Web應用兩部分。Fabric鏈碼采用GOLANG開發&#xff0c;負責維護資產的狀態&#xff0c;后臺為采用Node.js開發的Web應用&a…

同理心案例及故事分享_神經形態,視覺可及性和同理心

同理心案例及故事分享“A good UX designer has empathy”.“優秀的UX設計人員具有同理心”。 This is something every UX designer has heard at some point in their career. Empathy helps us get into the mindset of the user and build solutions that solve real probl…

純CSS實現beautiful按鈕

大家好&#xff0c;我是若川。邀你進源碼共讀群學習交流。今天分享一篇好文。可收藏&#xff5e;近期工作中遇到一個需求——實現一些酷炫的按鈕&#xff0c;看到效果圖之后&#xff0c;按鈕確實漂亮&#xff0c;有彈跳、顏色漸變、掃光、霓虹燈&#xff0c;瞬間激起了我的好奇…

linux的內核有多小,Linux 內核有小bug?

今天讀著讀著Linux代碼&#xff0c;竟然無意中發現Linux 0.11內核有個小bug&#xff0c;呵呵&#xff0c;人非圣賢孰能無過。// 在目錄項數據塊中搜索匹配指定文件名的目錄項&#xff0c;首先讓de 指向數據塊&#xff0c;并在不超過目錄中目錄項數// 的條件下&#xff0c;循環執…

菜單窗口_菜單

菜單窗口The Hamburger Menu widget is on every other site nowadays. It has become synonymous with the web and, perhaps even more so, with web development. Have, for instance, a look at Dribbble or Codepen. There you’ll find a fair share of examples. They c…

帝國cms 打開打開轉換表文件失敗!

帝國cms 升級到最新版6.6 后 生成列表頁面和 搜索 時出現 “打開打開轉換表文件失敗&#xff01;” 跟蹤文件找到 include($file); 這行代碼時出錯非常納悶&#xff0c;這個是php的內部命令啊&#xff0c;跟帝國的編碼應該沒有關系一直沒有再往下細找&#xff0c;只好根據錯誤提…

怎么在PDF上修改文字,PDF修改文字的步驟

怎么在PDF文件上修改文字呢&#xff1f;其實現在的很多的PDF文件上會出現文字錯誤的情況&#xff0c;想要修改PDF文件上面的文字卻不知道怎么修改&#xff0c;想要修改PDF文件還是比較簡單的&#xff0c;使用專業的PDF編輯器就可以進行操作了&#xff0c;下面小編就為大家分享一…

linux raw限制端口訪出,使用Linux raw socket時需要注意的一些問題

本文的copyleft歸gfree.windgmail.com所有&#xff0c;使用GPL發布&#xff0c;可以自由拷貝&#xff0c;轉載。但轉載請保持文檔的完整性&#xff0c;注明原作者及原鏈接&#xff0c;嚴禁用于任何商業用途。作者&#xff1a;gfree.windgmail.com博客&#xff1a;linuxfocus.bl…

讀完 Vue 發布源碼,小姐姐回答了 leader 的提問,并優化了項目發布流程~

大家好&#xff0c;我是若川。這是 源碼共讀 第三期活動&#xff0c;紀年小姐姐的第三次投稿。紀年小姐姐學習完優化了自己的項目發布流程&#xff0c;而且回答了leader對她的提問&#xff0c;來看看她的思考和實踐。第三期是 Vue 3.2 發布了&#xff0c;那尤雨溪是怎么發布 Vu…

小程序背景圖片的坑

本人是前端菜鳥一個&#xff0c;比小白還要白&#xff0c;這完全是自己的經驗總結&#xff0c;并不是要給各位分享什么寶貴經驗哈&#xff0c;各位大佬不喜勿噴&#xff0c;不然會打擊到我的哈哈因為公司要求做幾個小程序的頁面&#xff0c;我不得不拾起丟棄了幾個月的小程序開…

SimpleAdapter類使用方法

SimpleAdapter的構造函數是&#xff1a; public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) 官方說明了其各個參數含義&#xff0c;我這里根據自己的理解解釋下&#xff1a; 第一個context&…

小程序 富文本自適應屏幕_自適應文本:跨屏幕尺寸構建可讀文本

小程序 富文本自適應屏幕Many of you may already know about responsive web design. Cited from Wikipedia, responsive web design (RWD) is an approach to web design that makes web pages render well on a variety of devices and windows or screen sizes. The respon…

Vue、React 之間如何實現代碼移植?

大家好&#xff0c;我是若川。面對前端最火的兩個框架&#xff0c;學 React 還是 Vue &#xff1f;這可能是每個前端人都曾糾結過的問題。不過&#xff0c;現在你不用糾結了——因為很多公司都是兩個框架都有大量的應用&#xff0c;取決于不同團隊的技術選型&#xff0c;特別是…

linux mariadb 亂碼,配置mariadb遠程訪問權限,解決數據庫亂碼問題

配置mariadb遠程訪問權限&#xff1a;1)登錄數據庫:# mysql -uroot -p2)配置授權數據庫用戶遠程訪問權限&#xff0c;%表示所有遠程IP&#xff0c;也可以指定IP。WITH GRANT OPTION表示mysql數據庫的grant表中重新加載權限數據&#xff1a;GRANT ALL PRIVILEGES ON *.* TO 用戶…

平面設計師和ui設計師_游戲設計師的平面設計

平面設計師和ui設計師Design is a very ancient practice, but graphic design really found its core principles post World War One. Games are also very ancient but video games are still finding their feet. I think graphic design has a few things to teach people…

從零開發一個命令行腳手架工具 等

大家好&#xff0c;我是若川。今天周末&#xff0c;話不多說&#xff0c;這一次花了幾小時精心為大家挑選了20余篇好文&#xff0c;供大家閱讀學習。本文閱讀技巧&#xff0c;先粗看標題&#xff0c;感興趣可以都關注一波&#xff0c;絕對不虧。前端宇宙小編就職于某大廠&#…

linux的HAL庫函數,STM32 HAL庫 IIC 協議庫函數

/* 第1個參數為I2C操作句柄第2個參數為從機設備地址第3個參數為從機寄存器地址第4個參數為從機寄存器地址長度第5個參數為發送的數據的起始地址第6個參數為傳輸數據的大小第7個參數為操作超時時間 */HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF),0x10)…

pku acm 2140 Herd Sums http://acm.pku.edu.cn/JudgeOnline/problem?id=2140

2140代碼短小精悍&#xff1a;#include<stdio.h> int main() { int cnt0,i; long s; scanf("%ld",&s); for(i1;(i1)*i/2<s;i)if((s-(i-1)*i/2)%i0)cnt; printf("%d\n",cnt); return 0; }轉載于:https://www.cnblogs.com/Chinese-Coder-C…

java合成海報的工具類

2019獨角獸企業重金招聘Python工程師標準>>> package io.renren.common.utils;import cn.hutool.core.lang.Console; import io.renren.modules.oss.cloud.OSSFactory;import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import java.a…

a說b說謊b說c說謊說d說_說謊的眼睛及其同伙

a說b說謊b說c說謊說d說The eye is a complex and temperamental organ. By the end of this article, designers will have a better understanding of how the eye works with the brain, how it deconstructs images that the brain stitches back up again, and how the two…