cheerp 减小调用转换类型的开销的方式

简介: 这个文章主要描述在cheerp环境下, c++和javascript代码减小类型转换开销在cheerp,基本数据类型的C ++阵列如char,unsigned char,short,unsigned short,int,unsigned int,float和double由JavaScript键入相应类型的阵列的支持。

这个文章主要描述在cheerp环境下, c++和javascript代码减小类型转换开销

在cheerp,基本数据类型的C ++阵列如char,unsigned char,short,unsigned short,int,unsigned int,float和double由JavaScript键入相应类型的阵列的支持。

Cheerp提供了一些API来将C ++数组转换为底层的Typed Array对象。这对于将C ++数据直接传递给WebGL等浏览器API特别有用。

建议

在cheerp里如果对js侧公开一定的方法,请仔细处理转换程序, 应为在某个情况下,编译器并没有人聪明。
比如说我们都知道在c侧(经常需要) 拷贝内存, 有时候clang会把我们的代码交叉编译成赋值拷贝,这个就会有问题了, 如果我们在使用智能指针的时候,传递了一个超大的字节数组给cheerp,赋值拷贝的性能开销会很大。 我们在使用的时候一定要思考我们的最终目标是什么。如果是小块的内存拷贝,那么赋值的速度要优于大块的memcpy方法, 如果数量级比较大,比如说操作视频文件解密, 我们必须使用cheerp的特有转换API来告诉编译器,不要这样做。

转换API

TypedArrayForPointerType
template < typename Tstruct TypedArrayForPointerType ;

模板助手,为特定的C数据类型获取相应的Typed Array类型。所需类型可用作::type成员。例如

TypedArrayForPointerType < unsigned short > :: type
以下映射适用:

char - > Int8Array
unsigned char - > Uint8Array
短 - > Int16Array
unsigned short - > Uint16Array
int - > Int32Array
unsigned int - > Uint32Array
float - > Float32Array
double - > Float64Array
MakeTypedArray
该函数有两种实现方式。两者都接受两个参数:指向任何上述数据类型的数组的指针,以及可选的大小参数。默认值为0,表示“直到底层数组的末尾”。返回的值是指向类型化数组实例的指针。

注意:返回的类型化数组引用与传递指针相同的内存,不进行任何复制以保证此操作的效率。修改内存时请小心,因为编译器可能会或可能不会理解类型化数组与指针的内存相同。此函数旨在以较低的开销将C ++数据传递给浏览器API。

隐式打字版本
template < typename P,typename T = typename TypedArrayForPointerType

:: type>
T MakeTypedArray(const P ptr,size_t size = 0)
此函数返回ptr指针底层内存的类型化数组。返回类型取决于模板助手ptr的映射,并遵循TypedArrayForPointerType模板助手的映射。

明确键入的版本
template < typename T>
T MakeTypedArray(const void ptr,size_t size = 0)
此函数返回ptr指针底层内存的类型化数组,返回类型必须由用户显式提供。任何指针类型都可以作为传递ptr,但如果底层内存不是基本数据类型的数组,则结果是未定义的行为。

MakeArrayBufferView
client :: ArrayBufferView MakeArrayBufferView(const void ptr,size_t size = 0)
返回ptr指针底层内存的无类型ArrayBufferView 。不执行数据复制,返回的对象与ptr指针的别名相同。关于有效的内存别名的安全注意事项MakeTypedArray也是有效的MakeArrayBufferView。

使用例子

static ArrayBuffer myJsSayHello (uint8 buffer) {

    Uint8Array * t = (Uint8Array *)cheerp::MakeArrayBufferView(buffer);
    auto array = cheerp::makeArrayRef(t);

    for( int i = 0 ; i < array->get_length(); i++ ) {
        array[i] = array[i] + 100 ;
        *(buffer+i) = array[i];
    }
    //{age:20, c:{age:21},hellow:"cheerp"}
    struct Data d ;
    d.age = 20;
    d.c   = {21};
    memcpy(d.hellow ,"cheerp", 7);
    myCppSayHello(d);///js调用wasm
    return cheerp::MakeArrayBufferView(array);

}

输入js把Uint8Array进来以后,经过我们的处理,如果返回的话,最好使用MakeArrayBufferView 把我们的智能指针包装成js的ArrayBuffer对象返回。

相关文章
|
6月前
|
存储 编译器
深入解析i++和++i的区别及性能影响
在我们编写代码时,经常需要对变量进行自增操作。这种情况下,我们通常会用到两种常见的操作符:i++和++i。最近在阅读博客时,我偶然看到了有关i++和++i性能的讨论。之前我一直在使用它们,但从未从性能的角度考虑过,这让我突然产生了兴趣。尽管它们看起来相似,但它们之间存在微妙而重要的区别。在本文中,我们将详细解释i++和++i之间的区别,以及它们对代码性能的影响。
233 1
深入解析i++和++i的区别及性能影响
|
7月前
|
C++
有趣的动态转换
有趣的动态转换
|
8月前
|
Web App开发 机器人 数据安全/隐私保护
将上下文长度扩展到256k,无限上下文版本的LongLLaMA来了?
将上下文长度扩展到256k,无限上下文版本的LongLLaMA来了?
128 0
|
PyTorch 算法框架/工具
如何将网络参数初始化,或者如何将网络参数还原成原始参数状态
在以上代码中,_initialize_weights()方法用于对网络参数进行初始化。其中,init.ones_表示将权重初始化为1,init.zeros_表示将偏置初始化为0。 3. 如果想将网络参数恢复到初始状态,则可以重新调用_initialize_weights()方法
254 0
|
前端开发 程序员 C#
【C#】通过扩展对象的方式,对字符串等数据类型进行数据进一步处理
在本篇文章中,我们讲一起了解下对象扩展的使用 在实际项目开发中,对象扩展使用的场景还是挺多的,比如:需要对时间值进行再处理,或者字符串中的斜杠(/)转为反斜杠(\)
90 0
|
存储 程序员 C语言
如何进行C++动态转换
如何进行C++动态转换
如何进行C++动态转换
|
监控 Cloud Native Java
字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
在前面的ASM、Javassist 章节中也有陆续实现过获取方法的出入参信息,但实现的方式还是偏向于字节码控制,尤其ASM,更是需要使用到字节码指令将入参信息压栈操作保存到局部变量用于输出,在这个过程中需要深入了解Java虚拟机规范,否则很不好完成这一项的开发。但!ASM也是性能最牛的。其他的字节码编程框架都是基于它所开发的。
618 0
字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
|
C语言
用函数方法来比较三个数字中的较大值(常规,函数)
用函数方法来比较三个数字中的较大值(常规,函数)
97 0
用函数方法来比较三个数字中的较大值(常规,函数)
|
Java Maven Spring
蔡昊 - 如何高效而优雅的进行对象转换
简介 随着分层结构和DDD设计思想的普及,我们在后端开发过程中,会使用到VO/DO/DTO等等各种类型的模型对象,对象的转换工作也随着变得越来越多。而这种工作技术含量不高,却容易过多的出现在编码里,处理不当也会出现各种问题,那么如何更加高效而优雅的进行类型转换呢? 且花几分钟了解下笔者接下来要讲的一款Java代码生成器MapStruct——创建实现Java Bean之间转换的扩展映射器!
234 0
|
小程序
小程序 onLaunch 参数差别
小程序 onLaunch 参数差别
435 0
小程序 onLaunch 参数差别