Strings and Symbols are fundamentally different. String is a datatype for text. Symbols are a datatype for unique identifiers. You should use the one which best models your problem domain.
There may or may not be performance differences, but as always, you should only start thinking about exchanging strings for symbols, if all of the following are true:
- you have a hard performance requirement
- you have a precise definition of that hard performance requirement
- you have an exact number to hit for that hard performance requirement
- you have a statistically significant, representative, repeatable, automated benchmark for that performance requirement
- running that benchmark shows that you don't meet your performance requirement
- you cannot switch on more aggressive optimizations
- you cannot switch to a faster Ruby implementation
- you cannot buy faster hardware
- you cannot buy bigger hardware
- you cannot buy more hardware
- you cannot tweak the existing architecture
- you cannot change to a more performant architecture
- you cannot tweak the existing design
- you cannot change to a more performant design
- you cannot tweak the existing algorithm
- you cannot change to a more performant algorithm
- you have statistically significant, representative profiling data that shows that string comparisons are indeed the most pressing bottleneck in your application
Then, and only then does it make sense to think about such micro-optimizations.
Note that with Ruby moving towards immutable strings and string deduplication on the one hand, and garbage-collectable symbols on the other hand, the performance differences are likely to get smaller. It really is all about semantics: if it's text, use a string, if it's a unique name, use a symbol.