• C#调用脚本语言(三) IronJS 与 IronLua 简单方法性能比较


    1.   测试环境

    1.1. 硬件环境

    CPU:intel Core i7-740QM

    内存:8GDDR3 Memory

    1.2. 系统

    系统:Windows 8 Enterprise

    开发工具:Vs2012

    1.3. 打开应用

    IE(2个博客园页面),VS(2个),Word,QQ(2个),Kugoo,skyDriver,QQ管家,金山毒霸

    1.4. 运行前硬件使用率

    CPU:20%

    内存:3.8G

    2.   测试结果

    以下测试结果取平均值,单位毫秒

    测试脚本

    IronJs

    IronLua

    测试情况

    运行循环次数

    平均每次运行时间

    平均每次输出时间

    平均每次运行时间

    平均每次输出时间

    脚本(3.1)

    运行1次

    3936.5601

    3754.5366

    181.0706

    39.0323

    运行10次

    3506.2967

    3486.4970

    53.4373

    38.0273

    运行100次

    3322.4955

    3319.3787

    42.0150

    39.4533

    脚本(3.2)

    运行1次

    6402.9010

    6182.8698

    5030.6448

    4863.6206

    运行10次

    5426.4275

    5403.8228

    2720.1465

    2702.3338

    运行100次

    5264.9106

    5261.5463

    2305.2731

    2302.2437

    脚本(3.3)

    运行1次

    4829.6195

    4395.5726

    203.9511

    64.0034

    运行10次

    4260.7406

    4216.1312

    73.1036

    57.5132

    运行100次

    4219.6828

    4214.0657

    57.9017

    54.8742

    脚本(3.4)

    运行1次

    6496.8492

    6259.8139

    6031.8009

    5670.7524

    运行10次

    5584.7426

    5559.5219

    3010.6005

    2973.0923

    运行100次

    5364.0077

    5359.9148

    1889.2121

    1884.3506

    脚本(3.5)

    运行1次

    152999.6867

    152859.6952

    813.1022

    445.0527

    运行10次

    N/A

    N/A

    475.7581

    437.5456

    运行100次

    N/A

    N/A

    437.1177

    431.8419

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    3.   测试代码

    3.1. C#调用脚本方法,输出,无参

    3.1.1.   IronJS

      var v = new IronJS.Hosting.CSharp.Context();

      v.CreatePrintFunction();

      v.Execute("function GetFunction(){ var v = 1;}");

      for (int i = 0; i < 10000; i++)

      {

          v.GetFunctionAs<Printdel>("GetFunction")();

      }

    delegate dynamic Printdel()

    3.1.2.   IronLua

      Lua luaVM = new Lua();

      luaVM.DoString("function GetFunction() a=10 end");

      for (int i = 0; i < 10000; i++)

      {

           luaVM.GetFunction("GetFunction").Call();

      }

    3.2. C#调用脚本方法,输出,无参

    3.2.1.   IronJS

      var v = new IronJS.Hosting.CSharp.Context();

      v.CreatePrintFunction();

      v.Execute("function GetFunction(){ print(1);}");

      for (int i = 0; i < 10000; i++)

      {

          v.GetFunctionAs<Printdel>("GetFunction")();

      }

    delegate dynamic Printdel()

    3.2.2.   IronLua

      Lua luaVM = new Lua();

      luaVM.DoString("function GetFunction() print(1) end");

      for (int i = 0; i < 10000; i++)

      {

           luaVM.GetFunction("GetFunction").Call();

      }

    3.3. C#调用脚本方法,输出,值类型参数

    3.3.1.   IronJS

      var v = new IronJS.Hosting.CSharp.Context();

      v.CreatePrintFunction();

      v.Execute("function GetFunction(i){ var v = i;}");

      for (int i = 0; i < 10000; i++)

      {

          v.GetFunctionAs<Printdel>("GetFunction")(i);

      }

    delegate dynamic Printdel(dynamic i)

    3.3.2.   IronLua

      Lua luaVM = new Lua();

      luaVM.DoString("function GetFunction(i) a=i end");

      for (int i = 0; i < 10000; i++)

      {

           luaVM.GetFunction("GetFunction").Call(i);

      }

    3.4. C#调用脚本方法,输出,值类型参数

    3.4.1.   IronJS

      var v = new IronJS.Hosting.CSharp.Context();

      v.CreatePrintFunction();

      v.Execute("function GetFunction(i){ print(i); }");

      for (int i = 0; i < 10000; i++)

      {

          v.GetFunctionAs<Printdel>("GetFunction")(i);

      }

    delegate dynamic Printdel(dynamic i)

    3.4.2.   IronLua

      Lua luaVM = new Lua();

      luaVM.DoString("function GetFunction(i) print(i) end");

      for (int i = 0; i < 10000; i++)

      {

           luaVM.GetFunction("GetFunction").Call(i);

      }

    3.5. 脚本调用C#方法,输出,值类型参数

    3.5.1.   IronJS

    var v = new IronJS.Hosting.CSharp.Context();

    Action<string> action1 = new Action<string>((str) => { Console.WriteLine(str);});

    FunctionObject fun = IronJS.Native.Utils.createHostFunction(v.Environment, action1);

    v.SetGlobal("print", fun);

    for (int i = 0; i < 10000; i++)

    {

    v.Execute(string.Format("print({0});",i));

    }

    3.5.2.   IronLua

    Lua luaVM = new Lua();

    luaVM.RegisterFunction("Sleep2", this, this.GetType().GetMethod("LuaSleep"));

    for (int i = 0; i < 10000; i++)

    {

    luaVM.DoString("Sleep2(0)");

    }

    (由于时间关系,并未做太多测试,仅仅列出简单形式)

    PS:

    由于本次测试是为接下来的代码脚本化做基础,

    所以IronJs调用方法:

    定义:v.Execute("function GetFunction(){ print(1);}");

    获取、执行:v.GetFunctionAs<Printdel>("GetFunction")();

    并非如下形式:

    定义:dynamic dy = v.Execute("function GetFunction(){ print(1);}");

    执行:dy();

    因此效率很低

     
     
    分类: C#
  • 相关阅读:
    异步编程与scrapy
    统计学 李航读书笔记
    算法模型手写
    《剑指offer》面试题的Python实现
    numpy 中文手册
    django部署
    Django ORM中使用update_or_create功能再解
    RabbitMQ(七)心跳控制 -- heartbeat
    重写__eq__函数——对象list中使用in index()——获得list中不同属性对象个数
    Python机器学习及分析工具:Scikit-learn篇
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2881616.html
Copyright © 2020-2023  润新知