> gcc clang
> mbuiter mbuiterf mbuiter mbuiterf
> a 0.990 0.205 1.225 1.038
> b 1.032 0.207 1.232 1.054
> c 2.323 1.212 2.607 2.345
> d 2.036 0.905 2.358 2.076
> e 2.120 0.953 2.358 2.083
> f 15.335 15.036 15.307 15.496
> g 10.402 9.726 10.636 10.382
> h 11.082 10.223 11.324 10.899
> i 4.846 4.713 4.882 4.922
> j 5.151 4.919 5.097 5.137
The clang timings are suboptimal. The reason is that clang does not inline
the functions mbuiter_multi_next and mbuiterf_next. The following patch
fixes that, and produces good timings with clang:
gcc clang clang always_inline
mbuiter mbuiterf mbuiter mbuiterf mbuiter mbuiterf
a 0.990 0.205 1.225 1.038 0.853 0.204
b 1.032 0.207 1.232 1.054 0.793 0.205
c 2.323 1.212 2.607 2.345 2.046 1.261
d 2.036 0.905 2.358 2.076 1.810 0.933
e 2.120 0.953 2.358 2.083 1.748 0.979
f 15.335 15.036 15.307 15.496 14.649 15.996
g 10.402 9.726 10.636 10.382 9.883 9.646
h 11.082 10.223 11.324 10.899 10.373 10.083
i 4.846 4.713 4.882 4.922 4.822 4.682
j 5.151 4.919 5.097 5.137 5.052 4.923
2023-07-18 Bruno Haible <[email protected]>
mbiter, mbiterf, mbuiter, mbuiterf: Force inlining with clang.
* lib/mbiter.h (MBITER_INLINE): Use _GL_ATTRIBUTE_ALWAYS_INLINE.
* lib/mbiterf.h (MBITERF_INLINE): Likewise.
* lib/mbuiter.h (MBUITER_INLINE): Likewise.
* lib/mbuiterf.h (MBUITERF_INLINE): Likewise.
diff --git a/lib/mbiter.h b/lib/mbiter.h
index c9c18df05d..b9222fcc3a 100644
--- a/lib/mbiter.h
+++ b/lib/mbiter.h
@@ -82,7 +82,8 @@
#ifndef _MBITER_H
#define _MBITER_H 1
-/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE. */
+/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE,
+ _GL_ATTRIBUTE_ALWAYS_INLINE. */
#if !_GL_CONFIG_H_INCLUDED
#error "Please include config.h first."
#endif
@@ -97,7 +98,7 @@
_GL_INLINE_HEADER_BEGIN
#ifndef MBITER_INLINE
-# define MBITER_INLINE _GL_INLINE
+# define MBITER_INLINE _GL_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
#endif
struct mbiter_multi
diff --git a/lib/mbiterf.h b/lib/mbiterf.h
index f5a817dbed..4ea1500210 100644
--- a/lib/mbiterf.h
+++ b/lib/mbiterf.h
@@ -73,7 +73,8 @@
#ifndef _MBITERF_H
#define _MBITERF_H 1
-/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE. */
+/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE,
+ _GL_ATTRIBUTE_ALWAYS_INLINE. */
#if !_GL_CONFIG_H_INCLUDED
#error "Please include config.h first."
#endif
@@ -88,7 +89,7 @@
_GL_INLINE_HEADER_BEGIN
#ifndef MBITERF_INLINE
-# define MBITERF_INLINE _GL_INLINE
+# define MBITERF_INLINE _GL_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
#endif
struct mbif_state
diff --git a/lib/mbuiter.h b/lib/mbuiter.h
index 9e2e90a235..862efa3dbe 100644
--- a/lib/mbuiter.h
+++ b/lib/mbuiter.h
@@ -89,7 +89,8 @@
#ifndef _MBUITER_H
#define _MBUITER_H 1
-/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE. */
+/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE,
+ _GL_ATTRIBUTE_ALWAYS_INLINE. */
#if !_GL_CONFIG_H_INCLUDED
#error "Please include config.h first."
#endif
@@ -106,7 +107,7 @@
_GL_INLINE_HEADER_BEGIN
#ifndef MBUITER_INLINE
-# define MBUITER_INLINE _GL_INLINE
+# define MBUITER_INLINE _GL_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
#endif
struct mbuiter_multi
diff --git a/lib/mbuiterf.h b/lib/mbuiterf.h
index e74f9e16c1..43d257e549 100644
--- a/lib/mbuiterf.h
+++ b/lib/mbuiterf.h
@@ -80,7 +80,8 @@
#ifndef _MBUITERF_H
#define _MBUITERF_H 1
-/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE. */
+/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE,
+ _GL_ATTRIBUTE_ALWAYS_INLINE. */
#if !_GL_CONFIG_H_INCLUDED
#error "Please include config.h first."
#endif
@@ -97,7 +98,7 @@
_GL_INLINE_HEADER_BEGIN
#ifndef MBUITERF_INLINE
-# define MBUITERF_INLINE _GL_INLINE
+# define MBUITERF_INLINE _GL_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
#endif
struct mbuif_state