EFL メモ(EFL memo)

EFL のメモ用、Tizen もあるよ。(Memo for EFL, Sometimes Tizen )

ハッシュベンチマーク

Eina のハッシュの速度をほかのハッシュの実装と速度の比較を行ってみました。

ベンチ測定方法は id:fd0 さんの C/C++ で使える Hashtable - BOOLEANLABEL を参考にしています。

動作環境

各種ハッシュ実装とそのバージョン

  • glib2 2.24.1
  • glibc 2.12
  • libghthash 0.6.2
  • eet r50698
  • eina r50698

apr と stl はビルドが失敗したので今回は対象から外しています。
Qt の QHash も比較対象にしたかったんですが、いかんせん C++ の使い方がわからなくて断念しました。orz

ソースコード

eina
#include <stdio.h>
#include <string.h>
#include <Eina.h>

#include "bench.h"

Eina_Hash *hashtable;

void ht_usage(void)
{
  printf("Usage:\n"
         "bench_eina dictfile textfile\n");
}

int ht_init(int i_buckets, char *p_opts)
{
  hashtable = eina_hash_string_superfast_new(NULL);
  if(!hashtable) return 1;
  return 0;
}

int ht_insert(char *p_data, char *p_key)
{
  return eina_hash_add(hashtable, p_key, p_data);
}

char *ht_get(char *p_key)
{
  return eina_hash_find(hashtable, p_key);
}

int ht_remove(char *p_key)
{
  return eina_hash_del_by_key(hashtable, p_key); 
}

実行結果と結論

ビルドする。Glib がワーニングを吐いているど気にしない。

% make
gcc -c -O3 -DNDEBUG -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags apr-1` `pkg-config --cflags eina-0` `pkg-config --cflags QtCore` bench_glibc.c
gcc -c -O3 -DNDEBUG -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags apr-1` `pkg-config --cflags eina-0` `pkg-config --cflags QtCore` bench.c
gcc -c -O3 -DNDEBUG -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags apr-1` `pkg-config --cflags eina-0` `pkg-config --cflags QtCore` bench_main.c
gcc -static -o bench_glibc bench_glibc.o bench.o bench_main.o -lc
gcc -c -O3 -DNDEBUG -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags apr-1` `pkg-config --cflags eina-0` `pkg-config --cflags QtCore` bench_ght.c
gcc -static -o bench_ght bench_ght.o bench.o bench_main.o -lghthash
gcc -c -O3 -DNDEBUG -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags apr-1` `pkg-config --cflags eina-0` `pkg-config --cflags QtCore` bench_Glib.c
gcc -static -o bench_Glib bench_Glib.o bench.o bench_main.o -lc `pkg-config --libs glib-2.0`
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/../../../../lib/libglib-2.0.a(gutils.o): In function `g_get_any_init_do':
(.text+0xb55): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/../../../../lib/libglib-2.0.a(gutils.o): In function `g_get_any_init_do':
(.text+0xb49): warning: Using 'setpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/../../../../lib/libglib-2.0.a(gutils.o): In function `g_get_any_init_do':
(.text+0xb62): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/../../../../lib/libglib-2.0.a(gutils.o): In function `g_get_any_init_do':
(.text+0x870): warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/../../../../lib/libglib-2.0.a(gutils.o): In function `g_get_any_init_do':
(.text+0x8af): warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gcc -c -O3 -DNDEBUG -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags apr-1` `pkg-config --cflags eina-0` `pkg-config --cflags QtCore` bench_eina.c
gcc -static -o bench_eina bench_eina.o bench.o bench_main.o -lc `pkg-config --libs eina-0` -lpthread
gcc -c -O3 -DNDEBUG -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags apr-1` `pkg-config --cflags eina-0` `pkg-config --cflags QtCore` mean.c
gcc -o mean mean.o

実行結果

% ./do_benchmark.sh ./0drvb10.txt ./78.txt 
Running bench_glibc -0 three times to have the cache hot... 1 2 3 4 Done.
Now running bench_glibc -0 10 times... 1 2 3 4 5 6 7 8 9 10 Done.
The mean is 2.438182

Running bench_Glib -0 three times to have the cache hot... 1 2 3 4 Done.
Now running bench_Glib -0 10 times... 1 2 3 4 5 6 7 8 9 10 Done.
The mean is 0.276364

Running bench_eina -0 three times to have the cache hot... 1 2 3 4 Done.
Now running bench_eina -0 10 times... 1 2 3 4 5 6 7 8 9 10 Done.
The mean is 1.327273

Running bench_ght -1 three times to have the cache hot... 1 2 3 4 Done.
Now running bench_ght -1 10 times... 1 2 3 4 5 6 7 8 9 10 Done.
The mean is 0.297273

Glib と libghthash が早くて続いて eina 、glibc となります。
eina は eet のハッシュよりも健闘していますが、 Glib に比べるとまだまだですね。ていうか Glib 速すぎ。