¿Cómo compararías el rendimiento de una función?

Aquí hay quizás una pregunta más avanzada. Si tienes dos funciones que devuelven un valor.

int F(int input1, int input2) { int output; //some algorithm that assigns value to output// return output; } int D(int input1, int input2) { int output; //another algorithm that assigns value to output// return output; } 

Con la condición de que F (a, b) == D (a, b) (ambos devuelven el mismo valor para las mismas entradas).

Si desea comparar su desempeño, ¿cómo lo haría? Más precisamente, ¿cómo aislaría el tiempo que toma realizar F (a, b) o D (a, b) de manera que no refleje el tiempo que toma para las otras operaciones secundarias en la configuración de referencia?

Una de las mejores soluciones de código abierto disponibles es google benchmark . Debe crear envoltorios simples en torno al código que desea comparar y vincular de forma estática o dinámica con la biblioteca de referencia. A menudo es útil tener tales puntos de referencia micro comstackdos cerca de su código. Para la inspiración ver presentación impresionante .

 static void BM_F(benchmark::State& state) { const auto input1 = state.range_x(); const auto input2 = state.range_y(); while (state.KeepRunning()) F(input1, input2); } static void BM_D(benchmark::State& state) { const auto input1 = state.range_x(); const auto input2 = state.range_y(); while (state.KeepRunning()) D(input1, input2); } BENCHMARK(BM_F) ->ArgPair(1, 10) ->ArgPair(10, 100) ->ArgPair(100, 1000); BENCHMARK(BM_D) ->ArgPair(1, 10) ->ArgPair(10, 100) ->ArgPair(100, 1000); 

Si desea medir los ciclos de CPU sin procesar, entonces su única opción es utilizar instrucciones directas de la CPU. Para x86 puede utilizar el contador de sello de tiempo . Pero debe tener en cuenta que tales mediciones no resistirán ningún cambio de contexto realizado por el sistema operativo o saltando sobre las CPU. Su única opción en tal situación será usar algo con un solo flujo de ejecución, recordar la ID de la CPU y el valor de TSC antes de ingresar a la función de prueba y verificar la ID de la CPU después de la función de prueba. Luego calculando la diferencia entre los valores de TSC. También puede configurar la afinidad de la CPU para que su proceso pegue el proceso a una CPU específica.

Otra posible forma específica de Linux de evaluar las funciones es usar la herramienta perf .

Pero de cualquier manera, cualquier medida agregará algún nivel de error al resultado.