dcodeIO/webassembly의 툴체인에서 zlib을 빌드해 봅니다.

dcodeIO/webassembly: A minimal toolkit and runtime to produce and run WebAssembly modules. 내부의 툴 체인을 사용하여 zlib를 빌드하려고했습니다.

dcodeIO/webassembly란?



가볍고 실험적이고 최소한의 툴킷과 런타임을 가지고 c 파일을 wasm으로 컴파일하고 실행할 수 있습니다. malloc 라든지 최소한 원하는 것은 들어 있기 때문에, 약간의 프로그램을 쓰고 싶지만 emscripten 사용할 정도가 아닐 때에 편리합니다.

zlib 빌드



샘플 리포지토리 을 만들었으므로 git clone 와서 빌드합니다. Windows Subsystem for Linux, macOS High Sierra에서 동작 확인을 하고 있습니다.
$ git clone https://github.com/ukyo/zlib-wasm-without-emscripten-sample.git
$ cd zlib-wasm-without-emsripten-sample
$ npm install
$ npm run build

빌드 스크립트webassembly/build.js at master · dcodeIO/webassembly 을 참고로 하여 짚어 보았습니다 (흐름은 아래 그림을 참조).


<stdio.h> 가 없다고 말해져 조금 빠지거나 했습니다만, 헤더 파일을 위로 올리고 -isystem path/to/include 해서 회피했습니다. importObject에 넣는 함수를 정의하고 싶은 경우는 import.h 와 같은 헤더 파일만 만들면 임포트 하는 취급이 되는 것 같습니다.

벤치마크



wasm, pako, node의 zlib로 비교. 원시 deflate, inflate로 벤치마크를 취해 보았습니다.
  • Node: v8.9.1
  • OS: MacBook Pro High Sierra
  • CPU: Intel Core i5 2.4GHz
  • Memory: 16GB
  • $ npm run bench
    
    ## lorem_1mb.txt size: 1000205
    wasm x 9.61 ops/sec ±4.48% (27 runs sampled)
    pako x 8.70 ops/sec ±2.26% (25 runs sampled)
    native x 15.21 ops/sec ±3.15% (41 runs sampled)
    Deflate: Fastest is native
    ## deflated lorem_1mb.txt size: 257012
    wasm x 120 ops/sec ±10.26% (60 runs sampled)
    pako x 106 ops/sec ±8.56% (67 runs sampled)
    native x 211 ops/sec ±2.68% (74 runs sampled)
    Inflate: Fastest is native
    

    어떻게든 pako를 이기고 있군요 (이 정도의 규모라고 역시 JavaScript에는 이길 것 같다). 덧붙여서 파일 사이즈는 60.4KB(wasm) + 3.6KB(js). wasm 쪽은 gzip하고 28KB 정도이므로, 꽤 용서할 수 있는 범위가 아닐까요.

    요약



    Emscripten이나 사용하지 않고 dcodeIO/webassembly 내의 툴 체인에서 zlib를 wasm으로 컴파일 해 보았습니다. emsdk에 환경을 오염되지 않고 npm i && npm run build 정도로 빌드할 수 있는 것이 좋네요.

    좋은 웹페이지 즐겨찾기