avcodec/cbrt_tablegen: speed up dynamic table creation
authorGanesh Ajjanagadde <gajjanagadde@gmail.com>
Wed, 25 Nov 2015 21:59:07 +0000 (16:59 -0500)
committerGanesh Ajjanagadde <gajjanagadde@gmail.com>
Wed, 2 Dec 2015 00:05:19 +0000 (19:05 -0500)
On systems having cbrt, there is no reason to use the slow pow function.

Sample benchmark (x86-64, Haswell, GNU/Linux):
new:
5124920 decicycles in cbrt_tableinit,       1 runs,      0 skips

old:
12321680 decicycles in cbrt_tableinit,       1 runs,      0 skips

Reviewed-by: Ronald S. Bultje <rsbultje@gmail.com>
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
libavcodec/cbrt_tablegen.h
libavcodec/cbrt_tablegen_template.c

index 27a3e3a..59b5a1d 100644 (file)
@@ -29,7 +29,7 @@
 #include "libavcodec/aac_defines.h"
 
 #if USE_FIXED
-#define CBRT(x) (int)floor((x).f * 8192 + 0.5)
+#define CBRT(x) lrint((x).f * 8192)
 #else
 #define CBRT(x) x.i
 #endif
@@ -49,13 +49,12 @@ static av_cold void AAC_RENAME(cbrt_tableinit)(void)
 {
     if (!cbrt_tab[(1<<13) - 1]) {
         int i;
-        /* cbrtf() isn't available on all systems, so we use powf(). */
         for (i = 0; i < 1<<13; i++) {
             union {
                 float f;
                 uint32_t i;
             } f;
-            f.f = pow(i, 1.0 / 3.0) * i;
+            f.f = cbrt(i) * i;
             cbrt_tab[i] = CBRT(f);
         }
     }
index 9dd2cf5..1d71d34 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #define CONFIG_HARDCODED_TABLES 0
 #include "cbrt_tablegen.h"
+#include "libavutil/tablegen.h"
 #include "tableprint.h"
 
 int main(void)