ChakraCore/JSRT使用问题汇总
QQ交流群:523723780(ChakraCore)
ChakraCore是什么?
一个微软开源的,用于Windows IE/Edge内核的高效JS脚本引擎。
前不久微软开源了ChakraCore,并且支持跨平台。在Github可以搜到。即使在开源之前,Windows SDK也支持你的程序去Hosting JS,只需要简单的包含jsrt.h,链接jsrt.lib即可调用JSRT的API。只是旧版本的Windows系统所带引擎性能没有Windows10 Edge性能好.
关于Chakra与JSV8的性能比较
http://browserbench.org/JetStream/是一个浏览器评分工具(越高越好),在我平板的得分Chrome54(JSV8)是126.59,Edge(Chakra)是152.06。在cnblog某个用户的渲染评测中,Chrome54是83秒,Edge是110秒,越快越好。所以我也不好说哪个更快,就浏览器日常使用,肯定是Edge更快,更节能。
JS脚本支持有哪些优势?
在流行的脚本语言中,Lua的小巧高性能(性能指LuaJit的性能),Python的功能性一直受开发者青睐。有什么理由使用JS脚本呢?
JS脚本有众多的库支持
JS脚本被用于HTML网页开发,开发者众多
JS有众多大公司的支持
JS有优秀的即时编译(JIT)性能
JS有无敌的开发工具Visual Studio的支持
JS语言特性更类似C/C++,相比Lua要舒服很多
Chakra的嵌入优势:相比Lua的堆栈式API,Chakra的API更容易写胶水代码。
很多游戏使用Lua的原因是比Python性能好,没有其他可选方案了。Chakra的开源,应该带动开发者去使用JS脚本。Chakra对于大型Windows游戏开发者更大的好处在于系统支持,Lua需要去下载编译,而Chakra只需要包含头文件,链接lib。
如何在Windows嵌入Chakra?
请看我以前的文章。
如何在linux嵌入ChakraCore去实现一个JavaScript运行时容器?
如果你像Windows上一样使用ChakraCore,用动态链接的方式,那肯定会产生JsErrorNoCurrentContext错误。
我询问过微软,这是因为在Windows下,系统加载DLL时会调用DLL的入口DllMain,而Linux没有这个机制,而Linux下的Chakra却有这样的设计。
所以在Linux加载动态库(libChakraCore.so)以后,应该显式的调用DllMain。下面是我的实现,非官方。官方接受了我的意见,大概会在以后版本中改进linux版本的初始化方式。
2016年11月19日,我写这段话时的两天前,官方正则讨论这方面的设计细则。Github链接
#ifdef __linux__
typedef int (*DllMainPtr)(void* hmod, DWORD dwReason, void* pvReserved);
DllMainPtr dllmain;
void* handle = dlopen("libChakraCore.so", RTLD_LAZY); if (handle == nullptr)
throw runtime_error("Failed load library libChakraCore.so"); char* errstr = dlerror();
if (errstr != nullptr)
throw runtime_error(errstr); dllmain = (DllMainPtr)dlsym(handle, "DllMain");
errstr = dlerror();
if (errstr != nullptr)
{
dlclose(handle);
throw runtime_error(errstr);
}
if (dllmain == nullptr)
{
dlclose(handle);
throw runtime_error("find not DllMain");
} //模拟WIN DLL加载
dllmain(, , );
dllmain(, , ); dlclose(handle);
#endif // __linux__
可以列出全局对象或函数吗?
可以,除了Intl,这是个特例
JS可以使用引用(c++的&,c#的ref)参数吗?
不可以,即使你为传入Native的函数参数修改值也是没用的。
如果一定要用,那只能传一个引用类型的对象,在函数内部修改此对象的成员。var arr=[];(function (v){v[1]=1;})(arr);//arr[1] == 1
Chakra的API支持多线程吗?
支持,据我当前的研究,不同线程必须有各自的runtime对象,每个runtime可以有多个环境(context),同一个runtime下的多个环境可以自由交换数据,但环境之间不共享数据。也就是说api级别可以把环境1的数据带到环境2,但是脚本里,环境2是看不到环境1的数据的。
Chakra支持ES6的Symbol吗?
完全支持。
Chakra如何在原生函数里支持JS的闭包?
函数(function)也是对象(object),可以有自定义属性,所以,在原生API级别操作Chakra时,可以把需要闭包的变量放在函数的属性里。如果希望在脚本中是只读的,那么可以设置属性描述。如果希望在脚本中是隐藏的,那么可以用符号属性。
如何用API实现原生对象的多次继承?
假设需要我们有一个移动设备类,手机类从它继承,iPhone从手机继承,那么应该这样:
一个JsObject(用JsCreateObject),用来表示移动设备,可以添加成员,另一个JsObject用来表示手机,再有一个ExternalObject(用JsCreateExternalObject)用来表示一个实际的原生对象实例(iPhone)。
手机JsObject从移动设备JsObject继承(JsSetPrototype),iPhone从手机继承。
ChakraCore API的对象管理该如何做?
ChakraCore API的都在操作核心对象JsValueRef,Chakra内部会把生成的对象放在堆上。用API生成一个JsValueRef对象后,运行一段时间会垃圾回收掉。所以如果在你的程序中长期使用JsValueRef,需要保存它,那么应该调用调用JsAddRef为其添加引用计数。在不用时调用JsRelease减少引用计数。【2017/5/27】
附录:
1、JS的符号 ES6-Symbol
ChakraCore/JSRT使用问题汇总的更多相关文章
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 异常处理汇总 ~ 修正果带着你的Net飞奔吧!
经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...
- UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
- Oracle手边常用70则脚本知识汇总
Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...
- Oracle 数据库知识汇总篇
Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...
- Vertica 数据库知识汇总篇
Vertica 数据库知识汇总篇(更新中..) 1.Vertica 集群软件部署,各节点硬件性能测试 2.Vertica 创建数据库,创建业务用户测试 3.Vertica 数据库参数调整,资源池分配 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 关于DDD的学习资料汇总
DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...
- Oracle 列数据聚合方法汇总
网上流传众多列数据聚合方法,现将各方法整理汇总,以做备忘. wm_concat 该方法来自wmsys下的wm_concat函数,属于Oracle内部函数,返回值类型varchar2,最大字符数4000 ...
随机推荐
- 今日头条面试题——LRU原理和Redis实现
很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU. 我的第一反应应该是内存不够的场景下,淘汰旧内容的策略.LRU ... Least R ...
- java提高(7)---TreeSet--排序
TreeSet(一) 一.TreeSet定义: 与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的. 1)TreeSet类概述 ...
- go使用context包避免goroutine泄露问题
go是带内存自动回收的特性,因此内存一般不会泄漏.但是Goroutine确存在泄漏的情况,同时泄漏的Goroutine引用的内存同样无法被回收. 下面的程序中后台Goroutine向管道输入自然数序列 ...
- 使用Python开发chrome插件
本文由 伯乐在线 - xianhu 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:pythonspot.com.欢迎加入翻译小组. 谷歌Chrome插件是使用HTML.JavaScrip ...
- MySQL中间件之ProxySQL(12):禁止多路路由
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.multiplexing multiplexing,作用是将语句分 ...
- Ansible常用模块介绍及使用(week5_day1_part2)--技术流ken
Ansible模块 在上一篇博客<Ansible基础认识及安装使用详解(一)--技术流ken>中以及简单的介绍了一下ansible的模块.ansible是基于模块工作的,所以我们必须掌握几 ...
- Redis基础知识补充及持久化、备份介绍(二)--技术流ken
Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)--技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis ...
- cobbler单台服务器实现批量自动化安装不同版本系统-技术流ken
前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...
- Runtime详解(下)
Runtime应用 1.Runtime 交换方法 应用场景:当第三方框架或者系统原生方法功能不能满足我们的时候,我们可以在保持系统原有功能的基础上,添加额外的功能. 需求:加载一张图片直接用系统的[U ...
- does not support SSL connections
语言:C# 开发工具:Visual Studio 2017 问题场景介绍: nuget引用的MySql.Data版本是6.10.5,MySQL的数据库连接串如下: Server=xxx;Databas ...