您的位置:首页 > Web前端 > JavaScript

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

2013-01-29 16:08 1651 查看

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();

因此效率很低
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐