当前位置: 首页 > 后端技术 > Node.js

基于C++和Rust扩展nodejs的两种方式对比

时间:2023-04-03 19:31:36 Node.js

C??++方式npminstallnode-gyp-gmkdirdemo&&cdDemo&&npminitcreatefib.cccreatebinding.gypnode-gypconfigurebuildcreatetestindex.jsfilenode-gyphttps://github.com/nodejs/nod...为了测试性能比较,该算法使用斐波那契的递归实现。fib.cc://addon.cc#include命名空间演示{使用v8::Exception;使用v8::FunctionCallbackInfo;使用v8::隔离;使用v8::本地;使用v8::编号;使用v8::对象;使用v8::字符串;使用v8::值;unsignedintFib_Recursive(unsignedintfib){if(fib>2){return(Fib_Recursive(fib-1)+Fib_Recursive(fib-2));}elseif(2==fib){返回1;}elseif(1==fib){返回1;}返回1;}voidFib(constFunctionCallbackInfo&args){Isolate*isolate=args.GetIsolate();if(!args[0]->IsNumber()){isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate,"Wrongarguments")));返回;}intvalue=Fib_Recursive(args[0]->NumberValue());Localnum=Number::New(隔离,价值);args.GetReturnValue().Set(num);}voidInit(Localexports){NODE_SET_METHOD(exports,"fib",Fib);}NODE_MODULE(Fib,Init)}//namespacedemobing.gyp:{"targets":[{"target_name":"fib","sources":["fib.cc"]}]}nodejs引用使用:constFib=require('./build/Release/fib');//jsconsole.time('c++')console.log(Fib.fib(40));//'worldconsole.timeEnd('c++')functionfib(n){if(n===1||n===2){return1}returnfib(n-1)+fib(n-2)}函数fib2(n){如果(n<2){返回1;}变量a=1,b=1;对于(vari=2;ii32{返回匹配n{1|2=>1,n=>fib(n-1)+fib(n-2)}}Cargo.toml[package]name="cargo_test"version="0.1.0"authors=["zhangpeng53"][lib]name="ffi"crate-type=["dylib"]testindex.jsconstffi=require('ffi');construst=ffi.Library('target/release/libffi',{fib:['int',['int']]});//rustconsole.time('rust');console.log(rust.fib(40));console.timeEnd('rust');functionfib(n){if(n===1||n===2){返回1}返回fib(n-1)+fib(n-2)}函数fib2(n){如果(n<2){返回1;}变量a=1,b=1;对于(vari=2;i