Le stringhe e i simboli sono fondamentalmente diversi. String è un tipo di dati per il testo. I simboli sono un tipo di dati per identificatori univoci. Dovresti usare quello che meglio modella il tuo dominio problematico.
Potrebbero esserci o meno differenze nelle prestazioni, ma come sempre, dovresti solo iniziare a pensare allo scambio di stringhe per i simboli, se tutti dei seguenti sono vere:
- hai un requisito di prestazioni rigide
- hai una definizione precisa del requisito di prestazioni rigide
- hai un numero esatto da colpire per i requisiti di prestazioni rigide
- hai un benchmark statisticamente significativo, rappresentativo, ripetibile e automatizzato per quel requisito di prestazioni
- l'esecuzione di tale benchmark mostra che non soddisfi i requisiti di rendimento
- non puoi attivare ottimizzazioni più aggressive
- non puoi passare a un'implementazione Ruby più veloce
- non puoi acquistare hardware più veloce
- non puoi acquistare hardware più grande
- non puoi acquistare altro hardware
- non puoi modificare l'architettura esistente
- non puoi passare a un'architettura più performante
- non puoi modificare il design esistente
- non puoi passare a un progetto più performante
- non puoi modificare l'algoritmo esistente
- non puoi passare a un algoritmo più performante
- hai dati di profilazione rappresentativi e statisticamente significativi che mostrano che i confronti tra stringhe sono davvero il collo di bottiglia più pressante nella tua applicazione
Quindi, e solo , allora ha senso pensare a tali micro-ottimizzazioni.
Si noti che con Ruby che si muove verso le stringhe immutabili e la deduplicazione delle stringhe da un lato, e i simboli di raccolta dei rifiuti, dall'altro, è probabile che le differenze nelle prestazioni diminuiscano. È davvero tutto basato sulla semantica: se si tratta di testo, usa una stringa, se si tratta di un nome univoco, usa un simbolo.