Un paio di punti, primo. Uno è che costrutti linguistici di basso livello come questo che più o meno fanno la stessa cosa non sono quasi mai il collo di bottiglia in qualsiasi applicazione del mondo reale, quindi è (spesso) folle concentrarsi su di essi. In secondo luogo, come è già stato detto, se sei davvero preoccupato, dovresti metterlo a confronto. Gli strumenti di benchmarking e di profilo di Ruby non sono certamente i più avanzati nell'ecosistema di programmazione, ma svolgono il loro lavoro.
Il mio istinto è che gli hash saranno più veloci perché (ancora, suppongo) la dichiarazione del caso deve controllare ogni condizione a sua volta (facendo trovare gli elementi O (n) invece di O (1)). Ma controlliamo!
Codice completo di benchmarking allo https://gist.github.com/25 Fondamentalmente, genera un file che definisce il caso/hash appropriato e quindi li utilizza. Sono andato avanti e ho inserito la ricerca dell'hash all'interno di una chiamata al metodo, in modo che l'overhead non sia un fattore, ma nella vita reale non c'è motivo per cui debba essere bloccato all'interno di un metodo.
Ecco cosa ricevo. In ogni caso, sto facendo 10.000 ricerche. Il tempo è user-tempo in secondi
Case statement, 10 items 0.020000
Hash lookup, 10 items 0.010000
Case statement, 100 items 0.100000
Hash lookup, 100 items 0.010000
Case statement, 1000 items 0.990000
Hash lookup, 1000 items 0.010000
Così, sembra molto simile alla istruzione case è O (n) (senza shock lì). Si noti inoltre che le ricerche 10K sono ancora solo un secondo anche nell'istruzione case, quindi, a meno che non si stia facendo una metrica con il carico di queste ricerche, è meglio concentrarsi sul resto del codice.
fonte
2010-11-14 20:02:34
Simon, questa è l'ottimizzazione prematura. A meno che tu non abbia migliaia e migliaia di casi, non mi preoccuperei di scoprire quale è più performante. Concentrati solo sul tuo codice. –
abbiamo solo pochi casi, ma abbiamo ~ 7.000.000 di ricerche. – Simon