2009-12-15

libeventとlibevの比較

libeventは何回か使ったことはあったのですが、libevの方はまだ試してなかったのでとりあえずサンプルコードを動かしてみます。

#include <ev.h>
#include <stdio.h>

ev_io stdin_watcher;
ev_timer timeout_watcher;

static void stdin_cb (EV_P_ ev_io *w, int revents)
{
    puts ("stdin ready");
    ev_io_stop (EV_A_ w);
    ev_unloop (EV_A_ EVUNLOOP_ALL);
}

static void timeout_cb (EV_P_ ev_timer *w, int revents)
{
    puts ("timeout");
    ev_unloop (EV_A_ EVUNLOOP_ONE);
}

int main (void)
{
    struct ev_loop *loop = ev_default_loop (0);

    ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
    ev_io_start (loop, &stdin_watcher);

    ev_timer_init (&timeout_watcher, timeout_cb, 1, 0.);
    ev_timer_start (loop, &timeout_watcher);

    ev_loop (loop, 0);

    return 0;
}


これはlibev本家サイトにあったサンプルコードそのままです。
http://software.schmorp.de/pkg/libev.html

ちなみにこれを libeventで書くとこんな感じになります。
#include <sys/types.h>
#include <event.h>
#include <stdio.h> 

struct event stdin_watcher;
struct event timeout_watcher;
struct timeval t;

static void stdin_cb(int fd, short event, void *arg)
{
    puts ("stdin ready");
    event_del(arg);
    event_base_loopbreak(((struct event *)arg)->ev_base);
}

static void timeout_cb(int fd, short event, void *arg)
{
    puts ("timeout");
    event_base_loopbreak(((struct event *)arg)->ev_base);
}

int main (void)
{
    struct event_base *base = event_init();

    event_set(&stdin_watcher, 0, EV_READ, stdin_cb, &stdin_watcher);
    event_add(&stdin_watcher, NULL);
    event_base_set(base, &stdin_watcher);

    t.tv_sec = 1;
    evtimer_set(&timeout_watcher, timeout_cb, &timeout_watcher);
    timeout_add(&timeout_watcher, &t);
    event_base_set(base, &timeout_watcher);

    event_base_dispatch(base);

    return 0;
}



当然といえば当然ですがどちらも似た感じです。
というかこれだけでは見た目以外の違いがわかりませんね。

今度libevとlibeventの実装方法についても比較してみます

参考
http://libev.schmorp.de/bench.html
http://d.hatena.ne.jp/akkt/20080425/1209080621

0 件のコメント:

コメントを投稿

ZenBackWidget