• Stars
    star
    388
  • Rank 106,693 (Top 3 %)
  • Language
    C
  • Created over 13 years ago
  • Updated about 8 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

a tiny, lightning fast event loop for network applications

picoev

A tiny, lightning fast event loop for network applications

The text below is copied from the original publication

I am sure many programmers writing network applications have their own abstracting layers hiding the differences between various I/O multiplex APIs, like select(2), poll(2), epoll(2), ... And of course, I am one among them. While writing mycached (see Mycached: memcached protocol support for MySQL for more information), I was at first considering of using libev for multiplexing socket I/Os. Libevent was not an option since it does not (yet) provide multithreading support.

But it was a great pain for me to learn how to use libev. I do not mean that its is an ugly product. In fact, I think that it is a very well written, excellent library. However, for me it was too much a boring task to learn how the things are abstracted, already being familiar with the problems it tries to hide.

So instead I thought it might be a good occasion to write my own library that could be used in any programs I may write in the future. The result is picoev, and it is faster than libevent or libev! The benchmark used is a re-modified version taken from libev.schmorp.de/bench.html and can be found here. setup time event processing time

Why is it faster? It is because it uses an array and a ring buffer of bit vectors as its internal structure. Libevent and libev seem to use some kind of sorted tree to represent file descriptors. However, if we concentrate on Un*x systems, there is a guarantee that the descriptors will be a small positive integer. Picoev utilizes the fact and stores information related to file descriptors (such as pointers to callback functions or callback arguments) in an array, resulting in a faster manipulation of socket states.

Another optimization technique used by picoev is not to use an ordered tree for keeping timeout information. Generally speaking, most network applications do not require accurate timeouts. Thus it is possible to use a ring buffer (a sliding array) of bit vectors for the purpose. Each bit vector represents a set of file descriptors that time-outs at a given time. Picoev uses 128 of bit vectors to represent timeouts, for example, the first bit vector represents the sockets that timeout a second after, the second bit vector representing them of two seconds after..., and the bit vectors slide every second. If the maximum timeout required by the web application is greater than 128, the minimum granurality of timeout becomes two seconds.

I would like to reiterate that both libevent and libev are great libraries. Picoev is not at comparable to them especially in maturity and the number of features. It only supports select(2), epoll(2), and kqueue(2) for the time being. However the design is simple than the other two, and I think it will be a good starting point to write network applications, or to use as a basis for writing one's own network libraries.

More Repositories

1

picojson

a header-file-only, JSON parser serializer in C++
C++
1,082
star
2

unco

undo any command
C
229
star
3

rat

NAT written in pure ruby
Ruby
172
star
4

jailing

super-easy chroot jail builder/runner for Linux
Perl
165
star
5

kaztools

shellscripts and utilities for myself
Perl
96
star
6

picohash

header-file-only implementation of various hash algorithms
C
89
star
7

Starlet

a Plack Server, formerly known as Plack::Server::Standalone::Prefork::Server::Starter
Perl
69
star
8

C

pseudo-interpreter of the C programming language (using GCC)
C
64
star
9

mysql_json

a MySQL UDF for handling JSON
C++
63
star
10

wpbench

benchmark the load timings of a web page
HTML
61
star
11

picogc

a tiny, portable, precise, mark-and-sweep GC in C++
C
57
star
12

p5-Server-Starter

a superdaemon for hot-deploying server programs
Perl
44
star
13

rangecoder

a fast range coder in C++, using SSE
C++
37
star
14

sha1.min.js

SHA-1 implementation in JavaScript (1480 bytes; intended for bookmarklets, etc.)
JavaScript
34
star
15

url_compress

a static PPM-based URL compressor / decompressor
Perl
34
star
16

cppref

man-style access to cppreference.com documents
Perl
32
star
17

mod_reproxy

X-Reproxy-URL header support for Apache/2.x
C
31
star
18

p5-http-parser-xs

a fast http parser
C
30
star
19

zson

binary JSON, compact and with support for streaming
JavaScript
28
star
20

p5-text-microtemplate

Text::MicroTemplate
Perl
24
star
21

mysql-ranking-engine

(to become) a MySQL storage engine specializing in ranking operation
C++
23
star
22

golombset

An implementation of Golomb compressed set in C
C
22
star
23

manymanythreads

A synthetic benchmark of C10K problem using pthreads or epoll
C
21
star
24

cosmic

fail-safe management tools for network-based software RAID, using mdadm + iSCSI
Perl
18
star
25

p5-test-mysqld

mysqld runner for tests
Perl
18
star
26

komake

A wrapper of make with sub-make concurrency limit
Perl
17
star
27

force-dedupe-git-modules

forcibly dedupe git-based NPM modules
JavaScript
16
star
28

p5-Net-DNS-Lite

pure-perl DNS resolver with support for timeout
Perl
16
star
29

p5-Class-Accessor-Lite

Perl
14
star
30

daifuku

transaction logging in JSON, within the MySQL database
Perl
14
star
31

p5-Parallel-Scoreboard

A scoreboard for monitoring status of many processes
Perl
14
star
32

blockdiff

differential backup tool for block devices and files
Perl
13
star
33

p5-test-httpd-apache2

Apache2 starter for testing perl modules
Perl
13
star
34

p5-Cache-LRU

a simple, fast implementation of an LRU cache in pure perl
Perl
12
star
35

p5-string-filter

Regexp-based structured text converter
Perl
12
star
36

kmyacc

http://www005.upp.so-net.ne.jp/kmori/kmyacc/
C
11
star
37

p5-parallel-prefork

Perl
11
star
38

picotemplate

a tiny template engine for embedded HTML
Perl
10
star
39

nopan

install software directly from SVN or Git (instead of from CPAN)
Perl
9
star
40

hq

C++
8
star
41

qhashmap

an open-addressing, linear-probing hash table, derived from v8/src/hashmap.h
C++
8
star
42

picostring

simple rope impl. using std::string
C++
8
star
43

add_with_overflow

an example that links LLVM bitcode and C++ with link-time optimization
C++
8
star
44

App-Restarter

restart command when files change
7
star
45

visiflate

a dumper for Deflate (RFC 1951); useful for visualizing the algorithm
C
7
star
46

git-pushdir

pushes the files in current directory to Git repository
Perl
7
star
47

h2-cache-digest

code snippets for h2-cache-digest
C
6
star
48

puby

6
star
49

p5-test-postgresql

postgresql runner for tests
Perl
5
star
50

CGI-Application-Emulate-PSGI

a legacy-code-friendly PSGI adapter for CGI::Application
Perl
5
star
51

mprofile

http://developer.cybozu.co.jp/archives/kazuho/2009/07/mysql-539d.html
Perl
5
star
52

fakeiops

an LD_PRELOAD library for simulating storage systems with various IOPS
C
5
star
53

draft-kazuho-httpbis-priority

Makefile
5
star
54

quic-perf-metrics

Makefile
5
star
55

ieee754.js

Pure-javascript decoder for IEEE 754 floating point numbers
JavaScript
4
star
56

japanize.firefox

Firefox plugin for Japanize
JavaScript
4
star
57

incline

replicator for RDB shards
C++
4
star
58

friendsd

server of the `friends` program, used at komaba.ecc.u-tokyo.ac.jp from 1996 to 1999
4
star
59

draft-kazuho-quic-quic-on-streams

Makefile
4
star
60

benchart

Minimalistic benchmark logger and visualizer
Perl
3
star
61

p5-Sub-Throttle

Perl
3
star
62

p5-Sub-Timekeeper

calls a function with a stopwatch
Perl
3
star
63

SQL-QueryMaker

helper functions for SQL query generation
Perl
3
star
64

Plack-Middleware-AddDefaultCharset

port of Apache2's AddDefaultCharset
Perl
3
star
65

bindlocal

an LD_PRELOAD library that forces servers to listen on 127.0.0.1 instead of 0.0.0.0
C
3
star
66

esDateParser

a date parser compliant to ECMA 262, derived from V8
C++
3
star
67

Test-Mocha-PhantomJS

JavaScript
3
star
68

examples

code snippets
C
3
star
69

kazuho.github.com

HTML
2
star
70

draft-kazuho-quic-authenticated-handshake

Authenticated Handshake for QUIC (using ESNI)
Makefile
2
star
71

p5-DBIx-Printf

A printf-style prepared statement
Perl
2
star
72

aobench.jsx

original: http://kioku.sys-k.net/aobench_jsx/
JavaScript
2
star
73

draft-kazuho-quic-address-bound-token

Makefile
2
star
74

gh-fetch-submodules

fetch the missing submodule contents within a GitHub release tarball
Perl
2
star
75

kazutils.c

tiny set of C functions
1
star
76

net.examp1e.picoorm

Java
1
star
77

myfirst-usdt

learning userspace DTrace
Makefile
1
star
78

early-hints

now part of https://github.com/httpwg/http-extensions
Makefile
1
star
79

picoshparser

(experimental) parser of Structured Headers
C
1
star
80

force-dedupe-git-modules.m2

test repo for https://github.com/kazuho/force-dedupe-git-modules
JavaScript
1
star
81

draft-kazuho-httpbis-selftrace

Makefile
1
star
82

force-dedupe-git-modules.m1

test repo for https://github.com/kazuho/force-dedupe-git-modules
JavaScript
1
star
83

protected-sni

Makefile
1
star
84

http-cache-fingerprint

cache fingerprint header for HTTP
Makefile
1
star