Utilizzo di simboli anziché stringhe in condizioni

0

Di solito ho condizioni if/else che implicano il confronto di valori con una stringa costante.

È davvero vantaggioso utilizzare i simboli in questi casi o usare la stringa. Ad es.

if status == 'submitted'
  ...
elsif status.try(:to_sym) == :open
  ...

Inoltre, quali sono gli effetti sul consumo di memoria quando questa condizione si trova in un metodo di istanza o in un metodo di classe o in un metodo globale. La stringa occupa memoria ogni volta che viene chiamata?

    
posta Ashish Gaur 24.11.2015 - 13:15
fonte

2 risposte

1

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.

    
risposta data 24.11.2015 - 14:10
fonte
1

In Ruby, i simboli e le stringhe sono gli stessi con una sola differenza. I simboli sono inmutabili . here

Poiché le stringhe sono mutabili, ha anche un impatto sulle prestazioni.

Ma IMHO, penso che il motivo più importante per usare un simbolo invece di una stringa si trovi in questo articolo :

"... to use symbols every time you need internal identifiers. ..."

E nel tuo caso particolare, hai effettivamente un identificatore interno per lo stato. I futuri sviluppatori del tuo codice capiranno che ti stai riferendo a uno stato particolare e non alla rappresentazione che hai al momento.

    
risposta data 24.11.2015 - 13:32
fonte

Leggi altre domande sui tag