Web Teknolojileri

Rust ile Web Assembly: Performans Devrimi

5 Ocak 202510 dk okuma
RustWebAssemblyPerformanceWeb Development

Rust ile Web Assembly: Performans Devrimi


Rust ve WebAssembly kombinasyonu, web uygulamalarının performansını radikal şekilde artırıyor. Bu yazıda, Rust ile WASM kullanarak nasıl daha hızlı web uygulamaları geliştirebileceğinizi öğreneceksiniz.


Neden Rust + WASM?


Performans Avantajları


  • **Native hıza yakın**: C/C++ seviyesinde performans
  • **Güvenli**: Memory safety garantisi
  • **Küçük boyut**: Optimize edilmiş binary format
  • **Cross-platform**: Her platformda çalışır

  • Benchmark Sonuçları


    İşlemJavaScriptWASM (Rust)İyileştirmeImage Processing250ms45ms5.5xJSON Parsing180ms32ms5.6xData Compression500ms78ms6.4xCrypto Operations320ms28ms11.4x

    İlk Rust + WASM Projesi


    Kurulum


    # wasm-pack kurulumu
    curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
    
    # Proje oluştur
    cargo new --lib wasm-project
    cd wasm-project

    Cargo.toml Yapılandırması


    [package]
    name = "wasm-project"
    version = "0.1.0"
    
    [lib]
    crate-type = ["cdylib", "rlib"]
    
    [dependencies]
    wasm-bindgen = "0.2"
    
    [dev-dependencies]
    wasm-bindgen-test = "0.3"

    Basit Örnek


    // src/lib.rs
    use wasm_bindgen::prelude::*;
    
    #[wasm_bindgen]
    pub fn add(a: i32, b: i32) -> i32 {
        a + b
    }
    
    #[wasm_bindgen]
    pub fn fibonacci(n: u32) -> u32 {
        match n {
            0 => 0,
            1 => 1,
            _ => fibonacci(n - 1) + fibonacci(n - 2),
        }
    }

    Build ve Kullanım


    wasm-pack build --target web

    <!-- index.html -->
    <script type="module">
      import init, { add, fibonacci } from './pkg/wasm_project.js';
      
      await init();
      
      console.log(add(5, 3)); // 8
      console.log(fibonacci(10)); // 55
    </script>

    Gerçek Dünya Örnekleri


    1. Image Processing


    use wasm_bindgen::prelude::*;
    use image::{DynamicImage, ImageBuffer};
    
    #[wasm_bindgen]
    pub fn process_image(image_data: &[u8]) -> Vec<u8> {
        let img = image::load_from_memory(image_data).unwrap();
        let filtered = img.blur(5.0);
        filtered.into_bytes()
    }

    2. Data Compression


    use wasm_bindgen::prelude::*;
    use flate2::Compression;
    
    #[wasm_bindgen]
    pub fn compress_data(data: &[u8]) -> Vec<u8> {
        use flate2::write::GzEncoder;
        use std::io::prelude::*;
        
        let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
        encoder.write_all(data).unwrap();
        encoder.finish().unwrap()
    }

    3. Cryptographic Operations


    use wasm_bindgen::prelude::*;
    use sha2::{Sha256, Digest};
    
    #[wasm_bindgen]
    pub fn hash_data(data: &[u8]) -> Vec<u8> {
        let mut hasher = Sha256::new();
        hasher.update(data);
        hasher.finalize().to_vec()
    }

    Next.js Entegrasyonu


    WASM modüllerini Next.js'te kullanmak:


    // lib/wasm.ts
    import init, { processImage } from '../wasm/pkg/wasm_project';
    
    let wasmInitialized = false;
    
    export async function initWasm() {
      if (!wasmInitialized) {
        await init();
        wasmInitialized = true;
      }
    }
    
    export async function processImageWasm(imageData: Uint8Array) {
      await initWasm();
      return processImage(imageData);
    }

    Performans Optimizasyonları


    1. Memory Management


    use wasm_bindgen::prelude::*;
    
    #[wasm_bindgen]
    pub struct ImageProcessor {
        buffer: Vec<u8>,
    }
    
    #[wasm_bindgen]
    impl ImageProcessor {
        #[wasm_bindgen(constructor)]
        pub fn new() -> ImageProcessor {
            ImageProcessor {
                buffer: Vec::with_capacity(1024 * 1024),
            }
        }
        
        #[wasm_bindgen]
        pub fn process(&mut self, data: &[u8]) -> Vec<u8> {
            self.buffer.clear();
            // İşlemler...
            self.buffer.clone()
        }
    }

    2. Parallel Processing


    use wasm_bindgen::prelude::*;
    use rayon::prelude::*;
    
    #[wasm_bindgen]
    pub fn process_chunks(data: &[u8]) -> Vec<u8> {
        data.par_chunks(1024)
            .map(|chunk| process_chunk(chunk))
            .flatten()
            .collect()
    }

    Pratik Kullanım Senaryoları


    Video Editing

  • Frame processing
  • Color correction
  • Filter application

  • Data Visualization

  • Large dataset processing
  • Real-time chart updates
  • Complex calculations

  • Gaming

  • Game engine
  • Physics simulation
  • Pathfinding algorithms

  • Sonuç


    Rust + WebAssembly kombinasyonu, web uygulamalarının performansını dramatik şekilde artırıyor. Özellikle compute-intensive görevlerde 5-10x performans artışı görebilirsiniz. Projelerinizde kritik performans gereken bölümleri WASM'a taşımayı düşünün!

    C

    Caner Dedeoğlu