项目中使用V8做为脚本系统,运行速度基本能满足需要,但是有两点问题不太好处理:
一、C++到JS的相互调用及数据类型转换有一定的性能损失
二、GC时的stop-the-world中断时间
这两点基本是无解的。而且发现在最新的V8中,GC的时间不降反升,于是尝试了一下TCC,希望能解决部分问题。
对比方式是用一个简单的相加函数,在脚本中实现,在宿主中调用。
#include <iostream>
#include <v8.h>
#include <dew_utils.h>
using namespace v8;
int main(int argc, char** argv)
{
HandleScope scope;
Persistent<Context> context=Context::New();
Context::Scope context_sceop(context);
Handle<String> source=String::New("function fun1(a, b) { return a+b; }");
Handle<Script> script=Script::Compile(source);
script->Run();
Local<Value> value=context->Global()->Get(String::New("fun1"));
if(value->IsFunction())
{
Local<Function> fun=Local<Function>::Cast(value);
uint64 t1=GameUtils::msTimeStamp();
for(int i=0; i<100000; ++i)
{
Handle<Value> argv[2];
argv[0]=Integer::New(5);
argv[1]=Integer::New(6);
Local<Value> result=fun->Call(context->Global(), 2, argv);
}
uint64 t2=GameUtils::msTimeStamp();
std::cout<<"Result : "<<int(t2-t1)<<std::endl;
}
context.Dispose();
return 0;
}
#include <iostream>
#include <dew_utils.h>
#include <stdlib.h>
#include <iostream>
#include <dew_utils.h>
#include <stdlib.h>
#include <stdio.h>
#include <libtcc.h>
typedef int (*FunType)(int, int);
int main(int argc, char** argv)
{
char script[]="void main(int argc, char** argv){} \n int fun1() { return 101; } \n int fun2(int a, int b) { return a+b; }";
TCCState *s;
s=tcc_new();
tcc_set_lib_path(s, "/data/lib/tcc-0.9.26");
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
tcc_compile_string(s, script);
int size=tcc_relocate(s, NULL);
void* mem=malloc(size);
tcc_relocate(s, mem);
void* val=tcc_get_symbol(s, "fun1");
std::cout<<"Val : "<<*((int*)val)<<std::endl;
FunType fun=(FunType)tcc_get_symbol(s, "fun2");
if(fun)
{
uint64 t1=GameUtils::msTimeStamp();
for(int i=0; i<10000000; ++i)
{
int a=5, b=6;
int result=fun(a, b);
}
uint64 t2=GameUtils::msTimeStamp();
std::cout<<"Result : "<<int(t2-t1)<<std::endl;
}
return 0;
}
两种脚本系统中运行时间同为65ms左右,但使用TCC比使用V8的次数多了100倍。这和V8和C++之间相互调用性能不高有很大的关系,同为JIT,相信如果把循环体放在脚本中,差距没有这么严重。
结论:在性能要求比较高的地方,可以考虑用TCC代替V8,以改善本文开始时提到的两点问题。
分享到:
相关推荐
TCC_Rogerio.ipynb文件包含完整的TCC笔记本,可以在Anaconda的Jupyter Notebook或Google的协作环境(Google Colab)中运行。 如TCC第2.1项所述,导入数据集(可在经济部网站上找到)超过2 GB。 因此,笔记本电脑被...
ProjetoVeiculos:TCC Para Faculdade工程
SenaiVagasFront:TCC前端存储库
确认执行业务真正执行业务不作任何业务检查只使用Try阶段预留的业务资源Confirm操作满足幂等性取消:取消执行业务释放Try阶段预留的业务资源Cancel操作满足幂等性示例说明: tcc-transaction-和/或使用rpc框架合并,...
Otimiza-oHorario:Tcc基础Engenharia
TCC-eMusic:TCC的电子商务平台开发部
ProGrid:TCC Engenharia de Energia 2020年
linux中菜单和文件名中中文显示麻将方块,调整办法: 1.cd /usr/share/fonts 2.mkdir truetype 3.cd truetype 4.mkdir simsun 5.将simsun.tcc文件传到/usr/share/fonts/truetype/simsun/目录中 6.cd simsun 7...
雌激素 TCC 2019.1马龙
try成功或者失败后,由tcc框架进行补偿方法(confirm/cancel)调用,减少业务层重复编码和人工介入的重复劳动。 相关文档 TCC框架使用指南--dubbo版本 一、框架特性 支持跨服务的嵌套事务(Nested transaction ...
alocacaotcc:TCC-Alocação2020 01
基于TCC的分布式事务代码示例:使用tcc-transaction框架.zip
TCC在内部使用 2 , 3和 4提供的功能。 可以通过使用四个软件包中的函数来完成TCC的多步归一化。 在此GUI version of TCC (TCC-GUI) ,所有参数设置均可用,就像您使用的是原始设置一样。 此外,它还提供了许多...
TCC_posgrad:TCC da dasgraduaçãoem“ciêcinciade dados e big data”
TCC上的Ruby on Rails软件开发和信息管理系统。 解释: Ruby在轨6 Postgres Botstrap(模板: ) 链接至文件系统: 。 链接至系统: 。
Mythic的JXA脚本,显示TCC.db 博客文章: : 用法: 在Mythic中,使用jsimport并上传printTCCdb.js 将jsimport_call{"command":"print_tccdb()"}与3个参数之一一起使用 根jsimport_call{"command":"print_tccdb('...
tcc-加密 tcc代码 使用的链接: , int, int, int)
tccviciostecnologicosE.M.:TCC计划书第3期,在EnsinoMédiosobrevíciostecnológicos
人性化 TCC计划在2014年的WEB现实世界中脱颖而出。
CBT TCC网站保存收据,凭证和发票