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()
相关推荐
小c君tt6 分钟前
MFC中 error C2440错误分析及解决方法
c++·mfc
测试界的酸菜鱼6 分钟前
C# NUnit 框架:高效使用指南
开发语言·c#·log4j
GDAL6 分钟前
lua入门教程 :模块和包
开发语言·junit·lua
李老头探索8 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
CSXB999 分钟前
三十四、Python基础语法(文件操作-上)
开发语言·python·功能测试·测试工具
web Rookie29 分钟前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
工业甲酰苯胺40 分钟前
C# 单例模式的多种实现
javascript·单例模式·c#
很楠不爱40 分钟前
Qt——窗口
开发语言·qt
yi碗汤园40 分钟前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
木向41 分钟前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表