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
- Architecture - Modèles d’architecture d’application
- Tests - Testez votre application
- Compilation - Compilez des binaires optimisés