Obciążenie indeksowania
Indeksowanie początkowe i przyrostowe może zużywać znaczące CPU/pamięć
W miarę wzrostu twojej bazy kodu i skalowania zespołu, utrzymanie wydajności Cursor staje się krytyczne. Ten przewodnik obejmuje zaawansowane techniki optymalizacji, które utrzymują responsywność Cursor nawet pod dużym obciążeniem.
Obciążenie indeksowania
Indeksowanie początkowe i przyrostowe może zużywać znaczące CPU/pamięć
Rozmiar okna kontekstu
Duże okna kontekstu spowalniają odpowiedzi AI wykładniczo
Konflikty rozszerzeń
Rozszerzenia mogą interferować z funkcjami AI Cursor
Opóźnienie sieci
Wywołania API do modeli AI mogą być ograniczane przez szybkość sieci
Komponent | Minimum | Zalecane | Optymalne |
---|---|---|---|
RAM | 8GB | 16GB | 32GB+ |
CPU | 4 rdzenie | 8 rdzeni | 12+ rdzeni |
Pamięć masowa | SSD 256GB | NVMe 512GB | NVMe 1TB+ |
Sieć | 10 Mbps | 50 Mbps | 100+ Mbps |
# Zwiększ limity deskryptorów plikówsudo launchctl limit maxfiles 65536 200000
# Wyłącz indeksowanie Spotlight dla katalogów kodusudo mdutil -i off /path/to/code
# Zwiększ pamięć współdzielonąsudo sysctl -w kern.sysv.shmmax=2147483648sudo sysctl -w kern.sysv.shmall=524288
# Dodaj do /etc/sysctl.conf dla trwałościecho "kern.sysv.shmmax=2147483648" | sudo tee -a /etc/sysctl.confecho "kern.sysv.shmall=524288" | sudo tee -a /etc/sysctl.conf
# Zwiększ limity deskryptorów plikówecho "* soft nofile 65536" | sudo tee -a /etc/security/limits.confecho "* hard nofile 65536" | sudo tee -a /etc/security/limits.conf
# Zwiększ obserwatorów inotifyecho "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.confsudo sysctl -p
# Optymalizuj swappiness dla rozwojuecho "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
# Włącz transparent huge pagesecho "always" | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# Uruchom jako administrator
# Zwiększ pamięć wirtualnąwmic computersystem set AutomaticManagedPagefile=Falsewmic pagefileset set InitialSize=16384,MaximumSize=32768
# Wyłącz wyszukiwanie Windows dla katalogów koduSet-Service WSearch -StartupType Disabled
# Optymalizuj dla wydajnościpowercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
# Wyłącz niepotrzebne usługiSet-Service "SysMain" -StartupType DisabledSet-Service "Windows Search" -StartupType Disabled
// Konfiguracja wydajności Cursor{ "cursor.performance.memoryLimit": "8GB", "cursor.performance.maxWorkers": 6, "cursor.performance.cacheSize": "2GB", "cursor.performance.enableLazyLoading": true, "cursor.performance.garbageCollection": "aggressive", "cursor.performance.indexingThreads": 4, "cursor.performance.searchCacheEnabled": true, "cursor.performance.searchCacheSize": "1GB", "cursor.performance.incrementalIndexing": true, "cursor.performance.indexingBatchSize": 100}
Stwórz zoptymalizowany plik .cursorignore
:
# .cursorignore - maksymalizuj wydajność indeksowania
# Zależności i pakietynode_modules/vendor/packages/*/node_modules/**/bower_components/.pnpm-store/.yarn/
# Wyjścia budowydist/build/out/target/*.min.js*.min.css*.map
# Duże wygenerowane plikicoverage/*.generated.**.pb.go*.pb.jsschema.graphqlpackage-lock.jsonyarn.lockpnpm-lock.yaml
# Media i binaria*.jpg*.jpeg*.png*.gif*.mp4*.pdf*.zip*.tar.gz
# Logi i bazy danych*.log*.sqlite*.db
# Pliki IDE i systemu.idea/.vscode/.DS_StoreThumbs.db
# Fixtures testów i danefixtures/__fixtures__/testdata/*.snapshot__snapshots__/
// Wzorce optymalizacji kontekstu
// 1. Podejście warstwowego kontekstuclass ContextOptimizer { // Zacznij od minimalnego kontekstu async getMinimalContext(task: string) { return { currentFile: this.getCurrentFile(), directImports: await this.getDirectImports(), recentChanges: this.getRecentChanges(5) }; }
// Rozwijaj w miarę potrzeb async expandContext(feedback: string) { const additionalContext = await this.analyzeNeeds(feedback); return this.addContext(additionalContext); }
// Nigdy nie przekraczaj limitów async pruneContext(context: Context) { const tokenCount = await this.countTokens(context); if (tokenCount > this.maxTokens) { return this.intelligentPrune(context); } return context; }}
// Monitoruj i optymalizuj użycie kontekstuclass ContextMonitor { private contextHistory: ContextUsage[] = [];
async analyzeUsage() { const stats = { averageTokens: this.calculateAverage(), peakUsage: this.findPeak(), wastedTokens: this.identifyWaste(), optimalSize: this.calculateOptimal() };
return { stats, recommendations: this.generateRecommendations(stats) }; }
private identifyWaste() { // Znajdź uwzględnione pliki, które nigdy nie były referencowane return this.contextHistory .flatMap(usage => usage.includedFiles) .filter(file => !this.wasReferenced(file)); }}
// Inteligentny wybór modeluclass ModelSelector { selectModel(task: TaskType): Model { switch (task.complexity) { case 'simple': // Szybki, lekki model return { model: 'claude-4-sonnet', temperature: 0.3, maxTokens: 2000 };
case 'medium': // Zrównoważony model return { model: 'claude-4-sonnet', temperature: 0.5, maxTokens: 4000 };
case 'complex': // Potężny ale wolniejszy return { model: 'claude-4.1-opus', temperature: 0.7, maxTokens: 8000 };
case 'analysis': // Model długiego kontekstu return { model: 'gemini-2.5-pro', temperature: 0.4, maxTokens: 100000 }; } }}
Typ zadania | Wybór modelu | Czas odpowiedzi | Jakość | Koszt tokenów |
---|---|---|---|---|
Szybkie poprawki | Sonnet 4 | poniżej 2s | Dobra | Niski |
Rozwój funkcji | Sonnet 4 | 2-5s | Bardzo dobra | Średni |
Złożona refaktoryzacja | Opus 4 | 5-10s | Doskonała | Wysoki |
Analiza bazy kodu | Gemini 2.5 | 3-8s | Bardzo dobra | Średni |
Głębokie debugowanie | o3 | 10-20s | Doskonała | Bardzo wysoki |
# Debuguj problemy wydajności rozszerzeńcursor --inspect-brk-extensions 9229
# Uruchom w trybie bezpiecznym (bez rozszerzeń)cursor --disable-extensions
# Aby znaleźć problematyczne rozszerzenia:# 1. Wyłącz wszystkie rozszerzenia przez UI# 2. Włączaj je po jednym, aby wyizolować problemy
{ // Wyłącz rozszerzenia konfliktujące z Cursor AI "extensions.disabled": [ "github.copilot", "tabnine.tabnine-vscode", "visualstudioexptteam.vscodeintellicode" ],
// Lazy load ciężkich rozszerzeń "extensions.experimental.affinity": { "vscodevim.vim": 1, "dbaeumer.vscode-eslint": 2, "esbenp.prettier-vscode": 2 }}
// Implementuj inteligentne buforowanieclass ResponseCache { private cache = new Map<string, CachedResponse>(); private readonly TTL = 5 * 60 * 1000; // 5 minut
async getCachedOrFetch( prompt: string, fetcher: () => Promise<Response> ): Promise<Response> { const key = this.hashPrompt(prompt); const cached = this.cache.get(key);
if (cached && !this.isExpired(cached)) { return cached.response; }
const response = await fetcher(); this.cache.set(key, { response, timestamp: Date.now() });
return response; }}
{ "cursor.network.connectionPool": { "maxSockets": 10, "maxFreeSockets": 5, "timeout": 60000, "keepAlive": true, "keepAliveMsecs": 30000 },
"cursor.network.http2": { "enabled": true, "maxConcurrentStreams": 100 }}
// Monitorowanie wydajności w czasie rzeczywistymclass PerformanceMonitor { private metrics = { indexingTime: new MetricCollector('indexing'), searchLatency: new MetricCollector('search'), aiResponseTime: new MetricCollector('ai_response'), memoryUsage: new MetricCollector('memory'), cpuUsage: new MetricCollector('cpu') };
startMonitoring() { // Zbieraj metryki co 30 sekund setInterval(() => { this.collectMetrics(); this.analyzeThresholds(); this.generateAlerts(); }, 30000); }
private analyzeThresholds() { const alerts = [];
if (this.metrics.memoryUsage.current > 0.9) { alerts.push('Wykryto wysokie użycie pamięci'); }
if (this.metrics.aiResponseTime.p95 > 10000) { alerts.push('Wykryto wolne odpowiedzi AI'); }
return alerts; }}
// Włącz logowanie wydajności{ "cursor.telemetry.performanceLogging": true, "cursor.telemetry.logLevel": "verbose", "cursor.telemetry.logPath": "~/.cursor/performance.log", "cursor.telemetry.metrics": [ "indexing", "search", "completion", "memory", "network" ]}
Zespół zoptymalizował swoje masywne monorepo:
Podzielenie bazy kodu
Optymalizacja indeksowania
Strategia kontekstu
Wybór modelu
Optymalizacje środowiska krytycznego dla wydajności:
// Konfiguracja ultra-niskich opóźnień{ "cursor.performance": { "mode": "performance", "disableAnimations": true, "disableTelemetry": true, "minimalUI": true, "aggressiveCaching": true, "preloadModels": ["claude-4-sonnet"], "dedicatedWorkers": 8 }}
// Wyniki:// - Uzupełnianie tabulatora: poniżej 50ms// - Edycje inline: poniżej 100ms// - Odpowiedzi agenta: poniżej 2s średnio
Wysokie użycie CPU
Wolne odpowiedzi
Wycieki pamięci
Zawieszanie indeksowania
#!/bin/bash# Pełny reset wydajności
# 1. Zamknij Cursorkillall Cursor
# 2. Wyczyść cacherm -rf ~/.cursor/Cacherm -rf ~/.cursor/CachedDatarm -rf ~/.cursor/GPUCache
# 3. Zresetuj indeksyrm -rf ~/.cursor/IndexedDB
# 4. Wyczyść pamięć workspacerm -rf ~/.cursor/workspaceStorage
# 5. Uruchom ponownie ze świeżym profilemcursor --user-data-dir ~/.cursor-fresh
Profiluj przed optymalizacją
Stopniowe ulepszenia
Standardy zespołowe
Regularna konserwacja
Pamiętaj: najszybszy Cursor to ten skonfigurowany dla twojego konkretnego przepływu pracy. Nie ma rozwiązania uniwersalnego—eksperymentuj i mierz, aby znaleźć swoją optymalną konfigurację.