Si usted está preocupado por la eficiencia de su bucle, me animo a probar este:
obtener este código compilado y se ejecuta en un entorno de desarrollo, como Visual Studio, y establecer un punto de interrupción al principio . Cuando llegue allí, cambie a la vista de desmontaje (vista de instrucciones) y comience a presionar la tecla F11 (paso único), y lleve un recuento mental de cuántas veces la está golpeando.
Verá que entra en el ciclo, compara i
contra 25, y luego comienza a hacer el código para la línea cout
. Eso implica incrementar letter
, y luego pasar a la rutina <<
para cout. Hace una serie de cosas allí, posiblemente profundizando en subrutinas, etc., y finalmente vuelve a salir, devolviendo un objeto. A continuación, presiona "\t"
como argumento y lo pasa a ese objeto, vuelve a entrar y hace todo lo que hizo antes. Luego toma number
, lo incrementa y lo pasa a la rutina cout::<<
que acepta un entero, llama a una función para convertirlo en una cadena (que involucra un bucle), luego hace todo lo que hizo antes para enlazar esa cadena en el salida buffer y return.
¿Cansado? Aún no has terminado. El endl
tiene que salir, y cuando eso sucede, no solo pone "\n"
en el búfer, sino que llama a la rutina del sistema para vaciar ese búfer al archivo o consola donde está enviando la E/S. Probablemente no pueda usar F11, pero tenga la seguridad de que requiere muchos ciclos y no regresa hasta que se complete la E/S.
Por ahora, su conteo de F11 debe estar cerca de varios miles, más o menos.
Finalmente, sales y llegas a la instrucción ++i
, que toma 1 o 2 instrucciones, y salta al principio del ciclo para comenzar la siguiente iteración.
AHORA, ¿todavía le preocupa la eficiencia del circuito?
Hay una manera más fácil de hacer esto, y es igual de instructivo. Envuelve un ciclo infinito alrededor de todo tu código para que funcione para siempre. Mientras se está ejecutando, presiona el botón "pausa" en el IDE y mira la pila de llamadas. (This is called a "stackshot".) Si haces esto varias veces, tienes una buena idea de cómo pasa el tiempo. He aquí un ejemplo:
NTDLL! 7c90e514()
KERNEL32! 7c81cbfe()
KERNEL32! 7c81cc75()
KERNEL32! 7c81cc89()
MSVCRTD! 1021bed3()
MSVCRTD! 1021bd59()
MSVCRTD! 10218833()
MSVCRTD! 1023a500()
std::_Fputc() line 42 + 18 bytes
std::basic_filebuf<char,std::char_traits<char> >::overflow() line 108 + 25 bytes
std::basic_streambuf<char,std::char_traits<char> >::sputc() line 85 + 94 bytes
std::ostreambuf_iterator<char,std::char_traits<char> >::operator=() line 304 + 24 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Putc() line 633 + 32 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Iput() line 615 + 25 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::do_put() line 481 + 71 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::put() line 444 + 44 bytes
std::basic_ostream<char,std::char_traits<char> >::operator<<() line 115 + 114 bytes
main() line 43 + 96 bytes
mainCRTStartup() line 338 + 17 bytes
lo hice un montón de veces, y no una vez que se detenga en el código para el bucle externo i<=25
. Así que optimizar ese ciclo es como la gran metáfora de alguien: "cortarse el pelo para perder peso".
Gracias por los chicos de aclaración, me da la vuelta hacia adelante unas pocas páginas y se pide para reconstruirlo usando un ciclo for =). – SlackerByNature
ahh, los métodos maestros se vuelven claros –