Pregunta

En comparación con

  • Simple de acceso a la memoria
  • El acceso a disco
  • El acceso a la memoria en otro equipo(en la misma red)
  • El acceso a disco en otro equipo(en la misma red)

en C++ en windows.

¿Fue útil?

Solución

relativa de los tiempos (no debe estar fuera por más de un factor de 100 ;-)

  • la memoria de acceso en caché = 1
  • la función de llamada/retorno en caché = 2
  • la memoria de acceso de la caché = 10 ..300
  • el acceso a disco = 1000 ..1e8 (amortizado depende de la cantidad de bytes transferidos)
    • en función sobre todo de tiempos de búsqueda de
    • el traslado en sí mismo puede ser bastante rápido
    • implica, al menos, un par de miles de ops, ya que el usuario/sistema de umbral debe ser cruzado por lo menos dos veces;una solicitud de e/S deben ser programadas, el resultado debe ser escrita;posiblemente se asignan búferes...
  • llamadas de la red = 1000 ..1e9 (amortizado depende de la cantidad de bytes transferidos)
    • mismo argumento con e/s de disco
    • el raw de la velocidad de transferencia puede ser muy alta, pero de algún proceso en el otro equipo debe hacer el trabajo real

Otros consejos

Una llamada a una función es simplemente un cambio de el puntero de marco en la memoria en la pila y la adición de un nuevo marco en la parte superior de eso.Los parámetros de la función se desplaza en los registros locales para el uso y el puntero de la pila es de avanzada para la nueva parte superior de la pila para la ejecución de la función.

En comparación con el tiempo

Llamada a la función ~ simple de acceso a la memoria
Llamada a la función < El Acceso A Disco
Llamada a la función < el acceso a la memoria en otro equipo
Llamada a la función < el acceso a disco en otro equipo

En comparación con un simple acceso a la memoria - un poco más, realmente insignificante.

En comparación con todo lo demás que aparece - órdenes de magnitud menos.

Esto debe ser cierto para casi cualquier idioma en cualquier sistema operativo.

En general, una llamada a la función va a ser un poco más lento que el acceso a la memoria, ya que de hecho tiene que hacer varios accesos a la memoria para realizar la llamada.Por ejemplo, varios de empuje y de los cop de la pila son necesarios para la mayoría de las llamadas de función usando __stdcall en x86.Pero si el acceso a la memoria es una página que no está aún en la memoria caché L2, la llamada a la función puede ser mucho más rápido si el destino y la pila están todos en la CPU de la memoria caché.

Para todo lo demás, una llamada de función es que muchos (muchos) magnitud más rápido.

Difícil de responder, ya que hay un montón de factores que intervienen.

Primero de todos, "Simple de Acceso a la Memoria" no es simple.Puesto que, en la moderna velocidades de reloj, una CPU puede agregar dos números más rápido de lo que obtener un número de un lado del chip de la otra (la velocidad de La luz ... no Es sólo una buena idea, es la LEY)

Así, es la función que se llama en el interior de la CPU memoria caché?Es la memoria de acceso que se está comparando es demasiado?

A continuación, tenemos la llamada a la función se desactive la instrucción del procesador pipeline, lo que afectará a la velocidad de manera no determinista.

Suponiendo que te refieres a la sobrecarga de la llamada en sí, en lugar de lo que el destinatario podría hacer, es, definitivamente, mucho, mucho más rápido que todos, pero la "simple" de acceso a la memoria.

Es probablemente más lento que el acceso a la memoria, pero tenga en cuenta que, dado que el compilador puede hacer alineaciones, la función de la sobrecarga de la llamada es a veces cero.Incluso si no, es al menos posible en algunas arquitecturas que algunas de las llamadas a código ya en la caché de instrucciones, podría ser más rápido que el acceso principal (no almacenada) de la memoria.Depende de cómo muchos de los registros de la necesidad de ser derramada a la pila antes de hacer la llamada, y ese tipo de cosas.Consulte a su compilador y de la convención de llamada de la documentación, aunque es poco probable para ser capaz de averiguar más rápido que separar el código que se emite.

También tenga en cuenta que la "simple" de acceso a la memoria a veces no, si el sistema operativo tiene que traer a la página desde el disco, a continuación, tienes una larga espera en sus manos.Lo mismo sería cierto si usted salta en el código actualmente paginado en el disco.

Si la pregunta que subyace es "cuando debería optimizar el código para minimizar el número total de llamadas de función hecho?", entonces la respuesta es "muy cerca que nunca".

Este vínculo aparece mucho en Google.Para referencia en el futuro, me encontré con un pequeño programa en C# en el costo de una llamada a una función, y la respuesta es:"cerca de seis veces el costo de inline".A continuación están los detalles, vea //Salida en la parte inferior.ACTUALIZACIÓN:Mejor comparar manzanas con manzanas, he cambiado de Class1.Método para volver a "vacío", así como:public void Method1 () { // return 0;}
Todavía, en línea es más rápido por 2x:en línea (avg):610 ms;llamada de función (avg):1380 ms.Así que la respuesta, actualizado, es "dos veces".

el uso del Sistema;el uso del Sistema.Las colecciones.Genérico;el uso del Sistema.Linq;el uso del Sistema.Texto;el uso del Sistema.El diagnóstico;

espacio de nombres FunctionCallCost { Programa de clase { static void Main(string[] args) { De depuración.WriteLine("stop1");int iMax = 100000000;//100M DateTime funcCall1 = DateTime.Ahora;Cronómetro sw = Cronómetro.StartNew();

        for (int i = 0; i < iMax; i++)
        {
            //gives about 5.94 seconds to do a billion loops, 
          // or 0.594 for 100M, about 6 times faster than
            //the method call.
        }

        sw.Stop(); 

        long iE = sw.ElapsedMilliseconds;

        Debug.WriteLine("elapsed time of main function (ms) is: " + iE.ToString());

        Debug.WriteLine("stop2");

        Class1 myClass1 = new Class1();
        Stopwatch sw2 = Stopwatch.StartNew();
        int dummyI;
        for (int ie = 0; ie < iMax; ie++)
        {
          dummyI =  myClass1.Method1();
        }
        sw2.Stop(); 

        long iE2 = sw2.ElapsedMilliseconds;

        Debug.WriteLine("elapsed time of helper class function (ms) is: " + iE2.ToString());

        Debug.WriteLine("Hi3");


    }
}

// Clase 1 aquí el uso del Sistema;el uso del Sistema.Las colecciones.Genérico;el uso del Sistema.Linq;el uso del Sistema.Texto;

espacio de nombres FunctionCallCost { la clase Class1 {

    public Class1()
    {
    }

    public int Method1 ()
    {
        return 0;
    }
}

}

// Salida:stop1 tiempo transcurrido de la función principal (ms) es:595 stop2 transcurrido el tiempo de clase auxiliar de la función (ms) es:3780

stop1 tiempo transcurrido de la función principal (ms) es:592 stop2 transcurrido el tiempo de clase auxiliar de la función (ms) es:4042

stop1 tiempo transcurrido de la función principal (ms) es:626 stop2 transcurrido el tiempo de clase auxiliar de la función (ms) es:3755

El costo de la realidad, se llama a la función, pero no la ejecución en su totalidad?o el costo de la ejecución real de la función?simplemente la creación de una llamada a una función no es una costosa operación (actualización de la PC?).pero, obviamente, el costo de una función de ejecutar en su totalidad depende de lo que la función está haciendo.

No olvidemos que C++ tiene virtual de llamadas (mucho más caro, x10) y en WIndows se puede esperar de VS en línea para llamadas (coste 0 por definición, ya que no hay ninguna llamada a la izquierda en el binario)

Depende de lo que la función hace caer 2º en su lista si se tratara de hacer de la lógica con los objetos en memoria.Más abajo en la lista si se incluyen en el disco/acceso a la red.

Una llamada a una función generalmente implica simplemente un par de copias de la memoria (a menudo en los registros, por lo que no debe tomar mucho tiempo) y, a continuación, un salto de la operación.Esto será más lento que un acceso a la memoria, pero más rápido que cualquiera de las otras operaciones se mencionó anteriormente, debido a que requieren comunicación con el resto del hardware.El mismo debe generalmente cierto en cualquier SO/combinación de idiomas.

Si la función está alineada en tiempo de compilación, el costo de la función se convierte en equivelant a 0.

0 de ser, por supuesto, lo que se habría conseguido de no tener una llamada a la función, es decir:entre líneas a ti mismo.

Por supuesto, esto suena excesivamente obvio cuando lo escribo así.

El costo de una llamada de función depende de la arquitectura.x86 es considerablemente más lento (un par de relojes, además de un reloj o para cada argumento de la función) mientras que el de 64 bits es mucho menor debido a que la mayoría de los argumentos de las funciones se pasan en registros en lugar de en la pila.

Llamada de función es en realidad una copia de los parámetros en la pila (varios de acceso a la memoria), registro de guardar, el actual código de ejecución y, finalmente, el resultado de copiar y restaurar los registros (los registros de guardar/restaurar dependen del sistema).

Así que..hablando relativamente:

  • La función de llamada > Simple de acceso a la memoria.
  • Llamada a la función << El acceso a disco - en comparación con la memoria puede ser cientos de veces más caros.
  • Llamada a la función << El acceso a la memoria en otro equipo - el ancho de banda de red y el protocolo son el gran tiempo de los asesinos de aquí.
  • Llamada a la función <<< El acceso a disco en otro equipo - todo lo anterior y mucho más :)

Sólo el acceso a la memoria es más rápido que una llamada a una función.

Pero la llamada puede ser evitado si el compilador en línea de la optimización (para el compilador GCC(s) y no sólo se activa cuando se utiliza el nivel 3 de optimización (-O3) ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top