WebAssembly js 调用c++ 高性能传参

WebAssembly js 调用c++ 高性能传参

通过 Emscripten,你可以直接使用 JavaScript 的 TypedArray 与 C++ 共享内存,

从而避免频繁的数据拷贝操作。TypedArray 是一种高效的二进制数据表示形式,非常适合处理大规模数值数据。

js 调用:

cpp 复制代码
 function processDataPointer(inputArray) {
    // Create a Float32Array in JavaScript
    const data = new Float32Array(inputArray);
    const length = data.length;

    console.time("processDataPointer");
    // Allocate memory in WebAssembly
    const dataPtr = Module._malloc(data.byteLength);
    // Copy data from JavaScript to WebAssembly memory
    Module.HEAPF32.set(data, dataPtr / data.BYTES_PER_ELEMENT);
    console.timeEnd("parper data");
    Module._processDataPointer(dataPtr, length);
    // Free the allocated memory
    Module._free(dataPtr);
    console.timeEnd("processDataPointer");
  }

c++

cpp 复制代码
#include <iostream>
#include <vector>
#include <cmath>
#include <limits>

#include <emscripten/emscripten.h>


int main()
{
  std::cout << "hello" << std::endl;
  return 0;
}

extern "C"
{
  EMSCRIPTEN_KEEPALIVE
  void processDataPointer(float *data, int length)
  {
    double x{};
    double y{};
    double z{};

    // 假设输入的长度总是 3 的倍数
    for (int i = 0; i < length; i += 3)
    {
      x += data[i + 0];
      y += data[i + 1];
      z += data[i + 2];
    }
  }
}

cmakeList:

sh 复制代码
cmake_minimum_required(VERSION 3.19)
project(obb)

# 默认是Release,如果需要Debug环境,可以在生成时指定 -DCMAKE_BUILD_TYPE=Debug
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

set(CMAKE_CXX_STANDARD 11)

# include_directories(./include/)

file(GLOB SOURCE_FILES src/main.cpp)
file(GLOB HEADER_FILES src/*.h)


add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES})

target_link_libraries(${CMAKE_PROJECT_NAME})


if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")  # 关闭优化
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s WASM=1 -g -s MODULARIZE=1 -s EXPORT_NAME=createModule -s EXPORTED_FUNCTIONS=_processDataPointer,_malloc,_free -s INITIAL_MEMORY=128MB")
endif()
相关推荐
树叶@2 分钟前
Python数据分析7
开发语言·python
wydaicls5 分钟前
十一.C++ 类 -- 面向对象思想
开发语言·c++
Biomamba生信基地38 分钟前
R语言基础| 下载、安装
开发语言·r语言·生信·医药
姜君竹39 分钟前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构
思捻如枫42 分钟前
C++数据结构和算法代码模板总结——算法部分
数据结构·c++
奇树谦44 分钟前
使用VTK还是OpenGL集成到qt程序里哪个好?
开发语言·qt
VBA63371 小时前
VBA之Word应用第三章第十节:文档Document对象的方法(三)
开发语言
老胖闲聊1 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
拉不动的猪1 小时前
安卓和ios小程序开发中的兼容性问题举例
前端·javascript·面试
码界奇点1 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11