Mi aspetterei che foreach funzioni nominalmente più veloce in alcuni casi e lo stesso in altri, tranne nei casi in cui gli elementi sono un array effettivo nel qual caso il la differenza di performance è trascurabile
Se è implementato su un enumeratore, è essere più efficiente di un indicizzazione lineare, a seconda dell'implementazione zione. È improbabile che sia meno efficiente. Ad esempio, se qualcuno ha esposto un albero bilanciato sia come indicizzabile che enumerabile, allora foreach sarà decentemente più veloce. Questo perché ogni indice dovrà trovare indipendentemente l'elemento di riferimento, mentre un enumeratore ha il contesto del nodo corrente per navigare in modo più efficiente verso il prossimo ont.
Se si dispone di un array effettivo, dipende dall'implementazione della lingua e della classe se foreach sarà più veloce per lo stesso di.
Se l'indicizzazione è un offset di memoria letterale (come C++), quindi per dovrebbe essere leggermente più veloce poiché si evita una chiamata di funzione. Se l'indicizzazione è un indiretto, proprio come una chiamata, allora dovrebbe essere lo stesso.
Tutto ciò detto ... Trovo difficile trovare un caso per la generalizzazione qui. Questo è l'ultimo tipo di ottimizzazione che dovresti cercare, anche se c'è un problema di prestazioni nella tua applicazione. Se si ha un problema di prestazioni che può essere risolto cambiando il modo in cui si itera, non si ha realmente un problema di prestazioni. Hai un bug, perché qualcuno ha scritto un iteratore davvero schifoso, o un indicizzatore davvero schifoso.
fonte
2009-04-21 04:50:07
Solo una breve nota che se non si ha intenzione di modificare l'indice del ciclo foreach, è necessario utilizzare un const QString & invece - che ha implicazioni su anche la velocità. – swongu
Ecco una spiegazione del perché si vuole fare attenzione a includere il const: http://labs.qt.nokia.com/2009/01/23/iterating-efficiently/ –
L'importante aggiunta a questa domanda è che si dovrebbe mai e poi mai usare Qt 'foreach' per contenitori non Qt, molto probabilmente verrà eseguita una copia profonda e questa è la cosa che non si vuole anche senza averlo prima profilato. – Predelnik