Contribuer

Modifier cette documentation

Traduisez la documentation ou ouvrez le projet complet sur votre ordinateur.

Rien n’est publié tant que vous ne choisissez pas de soumettre votre travail.

Optimisation des performances

Optimisez votre application Wails pour obtenir des performances maximales

Présentation

Optimisez la vitesse, l’efficacité de la mémoire et la réactivité de votre application Wails.

Optimisation du frontend

Taille du bundle

javascript
// vite.config.js
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['react', 'react-dom'],
        },
      },
    },
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true,
      },
    },
  },
}

Fractionnement du code

javascript
// Lazy load components
const Settings = lazy(() => import('./Settings'))

function App() {
  return (
    <Suspense fallback={<Loading />}>
      <Settings />
    </Suspense>
  )
}

Optimisation des ressources

javascript
// Optimise images
import { defineConfig } from 'vite'
import imagemin from 'vite-plugin-imagemin'

export default defineConfig({
  plugins: [
    imagemin({
      gifsicle: { optimizationLevel: 3 },
      optipng: { optimizationLevel: 7 },
      svgo: { plugins: [{ removeViewBox: false }] },
    }),
  ],
})

Optimisation du backend

Bindings efficaces

go
// ❌ Bad: Return everything
func (s *Service) GetAllData() []Data {
    return s.db.FindAll() // Could be huge
}

// ✅ Good: Paginate
func (s *Service) GetData(page, size int) (*PagedData, error) {
    return s.db.FindPaged(page, size)
}

Mise en cache

go
type CachedService struct {
    cache *lru.Cache
    ttl   time.Duration
}

func (s *CachedService) GetData(key string) (interface{}, error) {
    // Check cache
    if val, ok := s.cache.Get(key); ok {
        return val, nil
    }
    
    // Fetch and cache
    data, err := s.fetchData(key)
    if err != nil {
        return nil, err
    }
    
    s.cache.Add(key, data)
    return data, nil
}

Goroutines pour les opérations longues

go
func (s *Service) ProcessLargeFile(path string) error {
    // Process in background
    go func() {
        result, err := s.process(path)
        if err != nil {
            s.app.Event.Emit("process-error", err.Error())
            return
        }
        s.app.Event.Emit("process-complete", result)
    }()
    
    return nil
}

Optimisation de la mémoire

Éviter les fuites de mémoire

go
// ❌ Bad: Goroutine leak
func (s *Service) StartPolling() {
    ticker := time.NewTicker(1 * time.Second)
    go func() {
        for range ticker.C {
            s.poll()
        }
    }()
    // ticker never stopped!
}

// ✅ Good: Proper cleanup
func (s *Service) StartPolling() {
    ticker := time.NewTicker(1 * time.Second)
    s.stopChan = make(chan bool)
    
    go func() {
        for {
            select {
            case <-ticker.C:
                s.poll()
            case <-s.stopChan:
                ticker.Stop()
                return
            }
        }
    }()
}

func (s *Service) StopPolling() {
    close(s.stopChan)
}

Mise en pool des ressources

go
var bufferPool = sync.Pool{
    New: func() interface{} {
        return new(bytes.Buffer)
    },
}

func processData(data []byte) []byte {
    buf := bufferPool.Get().(*bytes.Buffer)
    defer bufferPool.Put(buf)
    
    buf.Reset()
    buf.Write(data)
    // Process...
    return buf.Bytes()
}

Optimisation des événements

Temporisation des événements

javascript
// Debounce frequent events
let debounceTimer
function handleInput(value) {
    clearTimeout(debounceTimer)
    debounceTimer = setTimeout(() => {
        UpdateData(value)
    }, 300)
}

Mises à jour groupées

go
type BatchProcessor struct {
    items []Item
    mu    sync.Mutex
    timer *time.Timer
}

func (b *BatchProcessor) Add(item Item) {
    b.mu.Lock()
    defer b.mu.Unlock()
    
    b.items = append(b.items, item)
    
    if b.timer == nil {
        b.timer = time.AfterFunc(100*time.Millisecond, b.flush)
    }
}

func (b *BatchProcessor) flush() {
    b.mu.Lock()
    items := b.items
    b.items = nil
    b.timer = nil
    b.mu.Unlock()
    
    // Process batch
    processBatch(items)
}

Optimisation de la compilation

Taille du binaire

wails3 build ne possède pas lui-même d’option -ldflags : le fichier Taskfile fourni transmet déjà -ldflags="-s -w" à go build. Pour réduire davantage la taille du binaire, modifiez la tâche de compilation ou appelez directement go build :

bash
# Strip debug symbols and trim file paths
go build -ldflags="-s -w" -trimpath -o bin/myapp

Vitesse de compilation

bash
# Use build cache
go build -buildmode=default

# Parallel compilation
go build -p 8

Profilage

Profilage du processeur

go
import "runtime/pprof"

func profileCPU() {
    f, _ := os.Create("cpu.prof")
    defer f.Close()
    
    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()
    
    // Code to profile
}

Profilage de la mémoire

go
import "runtime/pprof"

func profileMemory() {
    f, _ := os.Create("mem.prof")
    defer f.Close()
    
    runtime.GC()
    pprof.WriteHeapProfile(f)
}

Analyser les profils

bash
# View CPU profile
go tool pprof cpu.prof

# View memory profile
go tool pprof mem.prof

# Web interface
go tool pprof -http=:8080 cpu.prof

Bonnes pratiques

✅ À faire

  • Effectuez un profilage avant d’optimiser
  • Mettez en cache les opérations coûteuses
  • Utilisez la pagination pour les grands jeux de données
  • Temporisez les événements fréquents
  • Regroupez les ressources dans des pools
  • Nettoyez les goroutines
  • Optimisez la taille du bundle
  • Utilisez le chargement différé

❌ À ne pas faire

  • N’optimisez pas prématurément
  • N’ignorez pas les fuites de mémoire
  • Ne bloquez pas le thread principal
  • Ne renvoyez pas d’immenses jeux de données
  • Ne faites pas l’impasse sur le profilage
  • N’oubliez pas de libérer les ressources

Liste de contrôle des performances

  • Bundle du frontend optimisé
  • Images compressées
  • Fractionnement du code mis en œuvre
  • Méthodes du backend paginées
  • Mise en cache mise en œuvre
  • Goroutines nettoyées
  • Événements temporisés
  • Taille du binaire optimisée
  • Profilage effectué
  • Fuites de mémoire corrigées

Étapes suivantes

Modifier la page

Dernière mise à jour :