녹슨 부분 및 WebAssembly 성능 향상🚀🚀🚀
14569 단어 webassemblyrustwebdevjavascript
WebAssembly
을 가능하게 했다.WebAssembly는 브라우저에서 C, C++, Rust 등의 언어를 실행할 수 있습니다.
녹슨 것과 인터넷 조립에 관한 제 책 좀 보세요 here
그런데 Web Assembly가 뭐예요?린클라크의 here 또는 this 하이라이트 게시물을 보십시오.
TL;박사:
opt-level=3
을 사용하십시오.opt-level="s"
을 사용하세요.우리 어떡하지?
markdown
형식의 문자열을 받아서 HTML로 변환하는 WebAssembly 응용 프로그램을 만듭니다.시작해보도록 하겠습니다.
지금까지 Rust는 WebAssembly의 가장 좋은 도구였다.그것은 언어와 잘 결합되어 있다.이로써 Rust는 WebAssembly를 진행하기에 가장 좋은 선택이 되었다.
우리는 시작하기 전에 녹 방지 페인트를 설치해야 한다.설치하려면 설치 설명서 here을 참조하십시오.
일단 녹이 끼면응용 프로그램을 만들기 시작합니다.
응용 프로그램 만들기
필요한 모든 도구 체인을 사용하여 WebAssembly 응용 프로그램을 만들려면 다음과 같이 하십시오.
npm init rust-webpack markdown-rust
이렇게 하면 Webpack과 함께 Rust+JavaScript 기반 응용 프로그램이 새로 만들어집니다.디렉터리에 들어가기
cd markdown-rust
그것은 Cargo.toml
과 package.json
이 있다.Rust 소스 파일은
src
디렉토리에 있고 JavaScript 파일은 js
디렉토리에 있습니다.또한 어플리케이션을 쉽고 빠르게 실행할 수 있도록 웹 패키지를 구성했습니다.Cargo.toml
에는 다음이 포함됩니다.[package]
# Some package information.
그리고 이 프로젝트는 다음 명령을 사용하여 dynamic library
을 구축할 것이라고 설명합니다.[lib]
crate-type = ["cdylib"]
또한 발표 프로필은 lto
로고를 사용하여 발표를 최적화해야 한다고 성명했습니다.[profile.release]
lto = true
마지막으로 [features]
과 [depdencies]
을 추가했습니다.지금 우리가 해야 할 일은 Rust에
markdown
라이브러리를 추가하는 것입니다. 이 라이브러리는 태그 (문자열) 를 HTML 문자열로 컴파일합니다.[dependencies]
# some comments ......
wasm-bindgen = "0.2.45"
comrak = "0.6"
src/lib.rs
에서 모든 내용물을 꺼내 다음과 같이 교체한다.우리가 사용할
comrak
함수와 wasm_bindgen
을 불러옵니다.use comrak::{markdown_to_html, ComrakOptions};
use wasm_bindgen::prelude::*;
그럼
wasm_bindgen
이 뭐예요?WebAssembly는 JavaScript나 문서 API를 호출할 바인딩이 없습니다.사실 우리는 자바스크립트와 WebAssembly 사이에서만 숫자를 전달할 수 있다.그러나 이것은 항상 취할 수 있는 것이 아니다. 우리는 그것들 사이에서 JS 대상, 문자열, 클래스, 클립과 다른 것을 전달해야 한다.
How can we achieve that?
우리는 상기 대상을 숫자로 변환하는 데 도움을 주는 귀속 파일이나 접착 파일을 만들 수 있습니다.예를 들어, 각 문자를 문자 코드로 보내는 대신 문자열에 대해
우리는 이 문자열을 선형 메모리 배열에 넣은 다음 시작 인덱스(메모리에 있는 위치)와 그 길이를 다른 세계(또는 JavaScript)에 전달할 수 있습니다.다른 세계는 이 선형 메모리 진열에 접근해서 정보를 얻을 수 있을 것이다.
그러나 JavaScript와 WebAssembly 사이에 전달된 모든 값에 대해 이 동작을 실행하는 것은 시간이 걸리고 오류가 발생하기 쉽다.wasm_bindgen 도구는 귀속 파일을 자동으로 구축하는 데 도움을 주고
#[wasm_bindgen]
주석이 있는 샘플 코드를 삭제할 수 있습니다.그러나 자바스크립트와 WebAssembly 모듈 사이의 경계를 뛰어넘는 횟수는 매우 조심해야 한다.우리가 횡단할수록 표현은 느려진다.
이제 태그 입력을 실제로 받고 HTML로 되돌아오는 parse라는 함수를 만듭니다.
#[wasm_bindgen]
pub fn parse(input: &str) -> String {
markdown_to_html(&input.to_string(), &ComrakOptions::default())
}
#[wasm_bindgen]
주석은 문자열을 두 개의 숫자로 변환하는 모든 템플릿을 완성했습니다. 하나는 선형 메모리에서 문자열의 시작을 가리키는 바늘이고 다른 하나는 문자열의 길이를 가리키는 바늘입니다.#[wasm_bindgen]
은 또한 JavaScript로 바인딩 파일을 생성합니다.JavaScript를 주문할 때가 됐어요.❤️
지금 우리는 이미 WebAssembly 모듈을 준비했다.지금은 JavaScript를 사용할 때입니다.
js/index.js
의 모든 행을 삭제하고 다음과 같이 바꿉니다.생성된 WebAssembly 모듈을 먼저 가져옵니다.Webpack을 사용하기 때문에 Webpack은
wasm_pack
을 안내하고 wasm_bindgen
을 사용하여 Rust를 WebAssembly 모듈로 전환한 다음에 필요한 귀속 파일을 생성합니다.wasm_pack
은 Rust와 WebAssembly 응용 프로그램을 구축하고 포장하는 데 도움을 주는 도구입니다.Wasm pack here에 대한 추가 정보.즉,
pkg/index.js
파일만 가져오면 됩니다.이것이 wasm pack이 출력을 생성하는 곳입니다.const rust = import('../pkg/index.js');
동적 가져오기는 promise를 만들고 해결되면 WebAssembly 모듈의 결과를 보여 줍니다.Rust 파일에 정의된 함수 parse
을 다음과 같이 호출할 수 있습니다.rust.then(module => {
console.log(module.parse('#some markdown content'));
});
또한 WebAssembly 모듈을 사용하여 컨텐트를 분석하는 데 필요한 시간도 계산합니다.rust.then(module => {
console.log(module.parse('#some markdown content'));
const startWasm = performance.now();
module.parse('#Heading 1');
const endWasm = performance.now();
console.log(`It took ${endWasm - startWasm} to do this in WebAssembly`);
});
비교를 위해 JavaScript를 사용하는 데 필요한 시간도 계산합니다.JavaScript의 태그 라이브러리를 설치합니다.
npm install --save marked
설치 후 JavaScript 코드를 작성하여 태그 텍스트를 받고 HTML로 돌아갑니다.
// js/index.js
import marked from 'marked';
// some content goes here;
const markdown = '#Heading';
const startJs = performance.now();
console.log(marked(markdown));
const endJs = performance.now();
console.log(`It took ${endJs - startJs} to do this in JavaScript`);
애플리케이션을 실행하려면 npm run start
을 사용하십시오.그러면 Webpack dev 서버가 시작되고 로컬 서버에서 컨텐츠가 제공됩니다.이것은 매우 재미있는 성능 통계 데이터다.
Chrome과 Safari에서 자바스크립트의 성능은 WebAssembly보다 훨씬 좋다.그러나 Firefox에서 자바스크립트 버전은 WebAssembly보다 50% 느리다.
이는 다른 브라우저에 비해 Firefox의 WebAssembly 링크와 안내 속도가 매우 빠르기 때문이다.
번들 크기를 살펴보면 WebAssembly 파일의 크기는 7475KB이고 JavaScript 변형의 크기는 1009KB입니다.
지금 WebAssembly에 야유를 보내고 있다면 기다려 주십시오.
우리는 아직 어떠한 최적화도 추가하지 않았다.최적화를 추가하고 성능을 검사합시다.
Cargo.toml
파일을 열고 [features]
섹션 위에 다음 섹션을 추가합니다.[profile.dev]
lto = true
opt-level = 3
opt-level
은 컴파일 프로젝트의 최적화 단계일 뿐이다.이곳의
lto
은 link-time-optimization
을 가리킨다.Note: This optimization level and lto should be added to the
profile.release
while working on the real application.
또한
wee_alloc
을 사용하면 메모리 분배가 훨씬 적습니다.Cargo.toml
에서 아래 내용을 주석하지 마십시오[features]
default = ["wee_alloc"]
wee_alloc
파일에 메모리 할당을 추가합니다.#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
이제 서버를 다시 시작합니다.이제 WebAssembly의 진정한 성능 이점을 확인할 수 있습니다.
Chrome에서 WebAssembly 버전의 속도는 JavaScript 버전의 4배입니다.
Safari에서 JavaScript 변수는 2~3ms 사이이지만 WebAssembly 변수는 0-2ms 사이입니다.
Firefox는 최적화된 WebAssembly 코드를 사용했을 때도 최적화되지 않았을 때보다 50% 가까이 빨랐다.
현재 가장 중요한 번들 크기는 WebAssembly 1280KB, JavaScript 1009KB입니다.
또한 Rust 컴파일러가 속도가 아닌 크기를 최적화하도록 요청할 수도 있습니다.지정하려면
src/lib.rs
을 opt-level
으로 변경하십시오.opt-level = "s"
WebAssembly는 여전히 뚜렷한 승자이지만, Chrome의 WebAssembly 횟수는 약간 증가했지만, 자바스크립트 변체보다 낮다.Safari와 Firefox 모두 WebAssembly에 더 높은 성능을 제공합니다.WebAssembly의 가방 크기는 1220, JavaScript의 가방 크기는 1009KB로 더 작아졌습니다.
또한 Rust 컴파일러는
s
을 지원하여 파일 크기를 더욱 줄입니다.opt-level = "z"
WebAssembly의 가방 크기는 약 1161KB로 더 줄었고 자바스크립트의 가방 크기는 1009KB였다.41ms에서 140ms 사이에
opt-level = "z"
을 사용할 때 크롬에서 WebAssembly 모듈의 성능 파동이 매우 크다.Mac Edition IE Canary의 성능은 크롬 Edition과 거의 같습니다.
패키지의 크기에 더 관심이 있지만 현재 v8의 성능이 신뢰할 수 없습니다.
opt-level='z'
을 사용하십시오.나는 이것이 너에게 동력을 주어 너의 멋진 Web Assembly 여행을 시작할 수 있기를 바란다.만약 당신에게 어떤 문제/건의/내가 무엇을 놓쳤다고 생각된다면 마음대로 평론을 추가하세요.
만약 네가 이 글을 좋아한다면, 너는 아마도 나의 녹슨 것과 인터넷 조립에 관한 책을 좋아할 것이다.here 보기
너는 나를 따라와도 된다.
만약 당신이 이 문장을 좋아한다면, 좋아하거나 평론을 남겨 주세요.❤️
Reference
이 문제에 관하여(녹슨 부분 및 WebAssembly 성능 향상🚀🚀🚀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sendilkumarn/increase-rust-and-webassembly-performance-382h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)