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<stringstring>();
            
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.mzph.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…

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

怎么在PDF文件上修改文字呢&#xff1f;其实现在的很多的PDF文件上会出现文字错误的情况&#xff0c;想要修改PDF文件上面的文字却不知道怎么修改&#xff0c;想要修改PDF文件还是比较简单的&#xff0c;使用专业的PDF编辑器就可以进行操作了&#xff0c;下面小编就为大家分享一…

读完 Vue 发布源码,小姐姐回答了 leader 的提问,并优化了项目发布流程~

大家好&#xff0c;我是若川。这是 源码共读 第三期活动&#xff0c;纪年小姐姐的第三次投稿。纪年小姐姐学习完优化了自己的项目发布流程&#xff0c;而且回答了leader对她的提问&#xff0c;来看看她的思考和实践。第三期是 Vue 3.2 发布了&#xff0c;那尤雨溪是怎么发布 Vu…

小程序 富文本自适应屏幕_自适应文本:跨屏幕尺寸构建可读文本

小程序 富文本自适应屏幕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…

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…

一名运营,自学一年前端,成功入职杭州某独角兽企业,他的面试经验和学习方法等分享...

大家好&#xff0c;我是若川。这是我的微信群里小伙伴年年 的投稿。他是19年毕业&#xff0c;之前做的是运营相关的工作&#xff0c;在我的交流群里非常活跃&#xff0c;自学一年前端&#xff0c;目前成功转行入职杭州一家独角兽企业。相信他的文章能带给大家一些启发和激励。0…

百度指数可视化_可视化指数

百度指数可视化Abstract:– Analysis of the visual representations of exponentials.– Proposals to solve current visualization issues.– Call to discussion to come up with a better visual representation convention.抽象&#xff1a; –分析指数的视觉表示形式。…

阿里云谦大佬:时间精力有限的情况下如何高效学习前端?

大家好&#xff0c;我是若川。最近组织了源码共读活动1个月&#xff0c;200人&#xff0c;一起读了4周源码&#xff0c;欢迎加我微信 ruochuan12 进群参与。今天分享一篇阿里云谦大佬的文章。昨天在群里也有小伙伴说到&#xff1a;大佬们是需要什么学什么&#xff0c;新手一般是…

sketch钢笔工具_Sketch和Figma,不同的工具等于不同的结果

sketch钢笔工具We like to compare the difference between various design programs and debate about which one is the most powerful. But we often forget to reflect on how using one of these tools is impacting our product. A powerful artist would say that he ca…

程序下载

Zaxis终端前置机 版 本下 载特 性1.20.1104.102ZaxisSetup.rar 分类: 程序下载转载于:https://www.cnblogs.com/baijinlong/archive/2011/05/13/2045263.html

提升效率的Vue组件开发和实战技巧

大家好我是若川。现在的大前端时代&#xff0c;是一个动荡纷争的时代&#xff0c;江湖中已经分成了很多门派&#xff0c;主要以Vue&#xff0c;React还有Angular为首&#xff0c;形成前端框架三足鼎立的局势。Vue在前端框架中的地位就像曾经的 jQuery&#xff0c;由于其简单易懂…

linux下telnet失败怎么处理,CentOS下telnet退出失败的解决办法

最近有CentOS用户反映在调试网络程序时出现了问题&#xff0c;服务虽然启动了&#xff0c;但客户端却无法连接上&#xff0c;用telnet连接后发现是Windows防火墙的问题&#xff0c;可是用telnet命令连接成功后发现退不出去了&#xff0c;这该怎么办&#xff1f;下面小编就给大家…