mallocの速度比較をしたかったのですが、tc_mallocが意地でもmallocを上書きする為測定にならなかったので、こちらの記事を参考にmalloc差し替えを無効化しました。
手順
1 . ソースダウンロード
公式githubから最新のソース gperftools-2.7を落としてきました。
https://github.com/gperftools/gperftools/releases
2. overrideコードの修正。 Linux向けに対応したのは以下。他のOSも同様に見えます。修正箇所はその他を参照ください。
* 関連するlibc_overrideヘッダー(src/libc_override_gcc_and_weak.h, src/libc_override_glibc.h)の上書き処理をコメントアウト
* unittestが通らずエラーになるため、src/tests/tcmalloc_unittest.ccでcfreeを定義
3. ビルド
configureがないので、autogen.shを実行する必要があります。
./autogen.sh
./configure
make
sudo make install
インストールパスは/usr/local配下になります。
ただし、これをやるとtc_malloc自体のスペックも落ちるようです。
その他
修正のdiff -cr結果はこんな感じです。
diff -cr gperftools-gperftools-2.7_ori/src/libc_override_gcc_and_weak.h gperftools-gperftools-2.7/src/libc_override_gcc_and_weak.h
*** gperftools-gperftools-2.7_ori/src/libc_override_gcc_and_weak.h 2018-04-30 15:00:34.000000000 +0900
--- gperftools-gperftools-2.7/src/libc_override_gcc_and_weak.h 2018-06-09 16:05:54.671886411 +0900
***************
*** 206,212 ****
#endif /* defined(ENABLE_SIZED_DELETE) */
#endif /* defined(ENABLE_ALIGNED_NEW_DELETE) */
!
extern "C" {
void* malloc(size_t size) __THROW ALIAS(tc_malloc);
void free(void* ptr) __THROW ALIAS(tc_free);
--- 206,212 ----
#endif /* defined(ENABLE_SIZED_DELETE) */
#endif /* defined(ENABLE_ALIGNED_NEW_DELETE) */
! #if 0
extern "C" {
void* malloc(size_t size) __THROW ALIAS(tc_malloc);
void free(void* ptr) __THROW ALIAS(tc_free);
***************
*** 234,240 ****
size_t malloc_usable_size(void* p) __THROW ALIAS(tc_malloc_size);
#endif
} // extern "C"
!
#undef ALIAS
// No need to do anything at tcmalloc-registration time: we do it all
--- 234,240 ----
size_t malloc_usable_size(void* p) __THROW ALIAS(tc_malloc_size);
#endif
} // extern "C"
! #endif
#undef ALIAS
// No need to do anything at tcmalloc-registration time: we do it all
diff -cr gperftools-gperftools-2.7_ori/src/libc_override_glibc.h gperftools-gperftools-2.7/src/libc_override_glibc.h
*** gperftools-gperftools-2.7_ori/src/libc_override_glibc.h 2018-04-30 15:00:34.000000000 +0900
--- gperftools-gperftools-2.7/src/libc_override_glibc.h 2018-06-09 15:52:38.397338332 +0900
***************
*** 69,75 ****
// same implementations. Since it only matters for redhat, we
// do it inside the gcc #ifdef, since redhat uses gcc.
// TODO(csilvers): only do this if we detect we're an old enough glibc?
!
#define ALIAS(tc_fn) __attribute__ ((alias (#tc_fn)))
extern "C" {
void* __libc_malloc(size_t size) ALIAS(tc_malloc);
--- 69,75 ----
// same implementations. Since it only matters for redhat, we
// do it inside the gcc #ifdef, since redhat uses gcc.
// TODO(csilvers): only do this if we detect we're an old enough glibc?
! #if 0
#define ALIAS(tc_fn) __attribute__ ((alias (#tc_fn)))
extern "C" {
void* __libc_malloc(size_t size) ALIAS(tc_malloc);
***************
*** 83,89 ****
int __posix_memalign(void** r, size_t a, size_t s) ALIAS(tc_posix_memalign);
} // extern "C"
#undef ALIAS
!
#endif // #if defined(__GNUC__) && !defined(__MACH__)
// No need to write ReplaceSystemAlloc(); one of the #includes above
--- 83,89 ----
int __posix_memalign(void** r, size_t a, size_t s) ALIAS(tc_posix_memalign);
} // extern "C"
#undef ALIAS
! #endif
#endif // #if defined(__GNUC__) && !defined(__MACH__)
// No need to write ReplaceSystemAlloc(); one of the #includes above
diff -cr gperftools-gperftools-2.7_ori/src/tests/tcmalloc_unittest.cc gperftools-gperftools-2.7/src/tests/tcmalloc_unittest.cc
*** gperftools-gperftools-2.7_ori/src/tests/tcmalloc_unittest.cc 2018-04-30 15:00:34.000000000 +0900
--- gperftools-gperftools-2.7/src/tests/tcmalloc_unittest.cc 2018-06-09 16:11:29.761269583 +0900
***************
*** 97,102 ****
--- 97,103 ----
#include "system-alloc.h"
#include "tests/testutil.h"
+ # define cfree free // don't bother to try to test these obsolete fns
// Windows doesn't define pvalloc and a few other obsolete unix
// functions; nor does it define posix_memalign (which is not obsolete).
#if defined(_WIN32)