`
larlf
  • 浏览: 107339 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

脚本系统:TCC和V8的简单对比

阅读更多
项目中使用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的分布式事务代码示例:使用tcc-transaction框架.zip

    分布式事务在大型分布式系统中是不可或缺的,它确保了数据的一致性和完整性。TCC(Try-Confirm-Cancel)模式是一种解决分布式事务问题的常见方案。这个压缩包“基于TCC的分布式事务代码示例:使用tcc-transaction...

    TCC(Tiny C Compiler)0.9.26源码 VS版工程

    这个源码包特别为Visual Studio环境优化,提供了VS2008和VS2013的支持,使得用户可以直接在这些版本的Visual Studio中打开、编译和调试TCC的源代码。 TCC的特性包括: 1. **小巧体积**:TCC的源代码相对其他编译器...

    TCC8803 datasheet

    "Telechips_TCC8803_CHIP_SPEC_V1.00.pdf"这份文档详细介绍了TCC8803芯片的技术规格、电气特性、引脚定义、接口协议等信息,是开发者进行产品设计和系统集成的重要参考材料。 总结,Telechips TCC8803 Cortex-A8...

    tcc-0.9.27-win64-bin.zip

    TCC的源代码是用C语言编写的,这使得它易于移植到不同的操作系统和硬件平台。TCC的0.9.27版本是该软件的一个稳定版本,针对64位Windows系统进行了优化,这从"tcc-0.9.27-win64-bin.zip"的文件名中可以看出来。这个...

    TCC编译器相关资料

    3. **教育工具**:TCC的简单性和速度使其成为教学C语言基础知识的好工具。 4. **脚本语言的后端**:一些动态语言可能会使用TCC作为后端,将源代码实时编译为机器码,提高运行性能。 **C++与TCC的结合** 虽然TCC...

    TCC:TCC网站保存收据,凭证和发票

    标题 "TCC:TCC网站保存收据,凭证和发票" 暗示了这是一个关于使用TCC(Transaction Confirmation Certificate,交易确认证书)技术来管理财务文档,如收据、凭证和发票的系统。在IT行业中,TCC通常用于分布式事务...

    TCC8902_FULL_SPEC

    TCC8902采用ARM11作为核心,意味着它拥有良好的兼容性和扩展性,可以运行各种基于ARM11指令集的操作系统和应用程序。 二、TCC8902的关键特性 1. **高清视频处理能力**:TCC8902处理器支持1080P(1920x1080分辨率)...

    tcc:TCC 2019.1马龙

    【标题】"TCC 2019.1马龙" 指的是TCC(Try-Confirm-Cancel)模式的一个特定版本,可能是某个技术会议或活动的主题,马龙可能是该活动的主要讲者或者相关研究的作者。TCC是分布式事务处理中的一种补偿事务模式,用于...

    TCC:TCC PUC米纳斯

    TCC_Rogerio.ipynb文件包含完整的TCC笔记本,可以在Anaconda的Jupyter Notebook或Google的协作环境(Google Colab)中运行。 如TCC第2.1项所述,导入数据集(可在经济部网站上找到)超过2 GB。 因此,笔记本电脑被...

    ProGrid:TCC Engenharia de Energia 2020年

    “ProGrid:TCC Engenharia de Energia 2020年”项目展示了C++在能源工程领域的强大应用,通过深入理解和分析“ProGrid-master”中的代码,我们可以学习到如何利用C++解决实际工程问题,为今后的能源系统开发提供宝贵...

    dubbo分布式tcc事务demo

    【标题】"dubbo分布式TCC事务demo"是关于如何在分布式系统中...通过深入研究这个dubbo分布式TCC事务demo,开发者可以掌握如何在实际项目中应用TCC模式,解决分布式环境下的事务一致性问题,提升系统的稳定性和可靠性。

    tcc-0.9.25.tar.bz2 tcc-0.9.25-win32-bin.zip

    这个版本适用于各种Linux发行版,因为它允许用户根据自己的系统配置来编译和定制TCC。 四、使用TCC的优势 1. 快速编译:TCC的编译速度远超传统的GCC等编译器,对于开发过程中频繁的编译测试非常有利。 2. 小巧便携...

    sigo:TCC解决方案集(POC)

    "TCC(Try-Confirm-Cancel)"是一种解决分布式事务问题的模式,它为业务系统提供了灵活的事务管理方式。本文将深入探讨TCC解决方案,并结合"JavaScript"这一编程语言,解析其在实际应用中的实现细节。 标题“sigo:...

    tcc-transaction:tcc-transaction是TCC型事务java实现

    确认执行业务真正执行业务不作任何业务检查只使用Try阶段预留的业务资源Confirm操作满足幂等性取消:取消执行业务释放Try阶段预留的业务资源Cancel操作满足幂等性示例说明: tcc-transaction-和/或使用rpc框架合并,...

    TCC8900 DATASHEET

    6. **安全特性**:现代微处理器越来越注重安全性,TCC8900可能包含硬件加密引擎,支持安全启动、数字版权管理(DRM)等功能,确保系统和数据安全。 7. **温度与电气特性**:工作温度范围、额定电压、电流消耗等信息...

    TCC-Transaction分布式事务DEMO

    通过分析和学习这个DEMO,我们可以更好地理解TCC模式在实际应用中的工作原理和实施细节。 总之,TCC模式提供了一种灵活且适用于复杂分布式系统的事务解决方案。通过掌握其核心思想和实现细节,我们可以设计出更健壮...

    人性化:TCC技术开发网络

    TCC的核心理念是将一个复杂的分布式事务分解为三个阶段:尝试、确认和取消,以此来降低系统复杂性并提高事务处理的灵活性。 1. **尝试(Try)阶段**:在这一阶段,系统尝试执行业务操作,但不提交任何变更,而是...

    TCC-Projeto-2021:TCC

    【标题】"TCC-Projeto-2021:TCC" 提示我们这是一个关于技术毕业设计(TCC)的项目,很可能属于2021年度完成的。TCC是葡萄牙语“Trabalho de Conclusão de Curso”的缩写,对应于英文中的Final Year Project或...

    天文台:TCC do Rafael

    考虑到这是一个学生的 TCC 项目,可能还涉及到了软件工程实践,如需求分析、系统设计、测试和文档编写等。项目可能包含一份详细的报告,阐述了项目的背景、目标、技术实现和成果评估。 总结来说,"天文台:TCC do ...

Global site tag (gtag.js) - Google Analytics