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
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#调用脚本语言(三)-- IronJS 与 IronLua 简单方法性能比较的更多相关文章
- Java动态调用脚本语言Groovy
Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...
- LoadRunner脚本关联动态数据的最简单方法
为什么要关联动态数据呢?举个例子,在对我们平台的工作流性能测试时, 在待办任务里面选择一条记录执行发送操作,LoadRunner VuGen会详细记录下来流程发送操作的细节,但在回放脚本的时候会有问题 ...
- 常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript
常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript Javascript现阶段还不适合用来做独立开发,它的天下还是在web应用 ...
- 使用bison和yacc制作脚本语言(1)
使用bison和yacc制作脚本语言(1) 环境: 环境 windows 10 Cygwin64 语言 C 工具 mingw bison flex 主要是使用bison和flex这两个软件,编译器无所 ...
- java 计算数学表达式及执行脚本语言
java SE6中对常用的脚本语言做了支持. 可供使用者在java代码中执行脚本语言,还可以利用get("key"),put("key","value ...
- Unity3d中如何混用三种脚本语言?
首先要明白,这三种说的混用是指文件级别的混用,就是说一个文件是由一种语言写的.而不是说你这一个文件可以混用这三种语言,注意这是不允许的. 第二要明白,在unity3d中为什么可以使用三种语言混合开发? ...
- 脚本语言丨Batch入门教程第四章:调用与传参
今天是Batch入门教程的最后一章内容:调用与传参.相信通过前面的学习,大家已经掌握了Windows Batch有关的基础知识和编程方法,以及利用Windows Batch建立初级的编程思维方式.今后 ...
- 脚本语言:Xmas(三)
自从将Xmas的GC换成现在的非迁移式的全局收集器后,最近几个月一直耗在Xmas上面:最明显的改变就是:更彻底地支持了面向对象.更强大的编译器. 所以,本文就来说说,真正的Xmas. 一.目标 一门语 ...
- shell脚本中调用其他脚本的三种方法
方法一:使用 . #. ./sub.sh 方法二:使用 source #source ./sub.sh 方法三:使用 sh #sh ./sub.sh 注意: 1.两个点之间,要有空 ...
随机推荐
- JavaScript高级程序设计之Date类型
ECMAScript 中的 Date 类型是在早期 Java 的 java.util.Date 类基础上构建的. Date 类型使用自 UTC (国际协调时间)1970年1月1日午夜(零时)开始经过的 ...
- [译]rabbitmq 2.5 Where’s my message? Durability and you
我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. There’s a dirty secret about creating queues and exchanges in ...
- Hadoop组成
Hadoop由以下几个子项目组成: Hadoop Common Hadoop体系最底层的一个模块,为Hadoop各子项目提供各种工具,如:配置文件和日志操作等. Avro Avro是doug cutt ...
- Effective Objective-C 2.0之Note.04
“类族”(class cluster)是一种很有用的模式(pattern),可以隐藏“抽象基类”(abstract base class)背后的实现细节.Objective-C的系统框架中普遍使用此模 ...
- 10个 iOS 用户暂可以嘲笑 Android 的特点
Android 与 iOS 设备之间的争斗从未停止,毕竟一切高科技产品的理念和实际表现方式都不相同.就拿 Android 来说,很多功能令用户并 不太开心,甚至是令人愤怒,下面让我们来简单的盘点 10 ...
- [转]40多个关于人脸检测/识别的API、库和软件
[转]40多个关于人脸检测/识别的API.库和软件 http://news.cnblogs.com/n/185616/ 英文原文:List of 40+ Face Detection / Recogn ...
- iOS 进阶 第二十天(0520)
0520 -KVO 如下图所示:(面试可能会问到,你就按照下面的说) 注意:NSString类型的成员变量用set方法时,要记得用copy,至于为什么,知道这么用就行了.如下图:
- opencv颜色识别代码分享
android 平台 opencv 实现颜色识别代码:http://www.eyesourcecode.com/thread-40682-1-1.htmlopencv的颜色识别简单实现的代码:http ...
- 与电子钱包相关的APDU指令
CLS:命令报文的类别字节,class byte(类别字节) of command message(命令报文) UranusPay ED/EP: UranusPay是HB公司开发的COS,而ED是电子 ...
- Log4Net学习【二】
Log4Net结构详解 当我们在描述为系统做日志这个动作的时候,实际上描述了3个点:做日志,其实就是在规定,在什么地方 用什么日志记录器 以什么样的格式做日志.把三个最重要的点抽取出来,即什么地方,日 ...