Skip to content

Instantly share code, notes, and snippets.

@neesenk
neesenk / test.c
Created November 27, 2010 15:43
fast ffs and ffsl
static char ffslut32[] = {
32, 1, 23, 2, 29, 24, 14, 3, 30, 27, 25, 18, 20, 15, 10, 4,
31, 22, 28, 13, 26, 17, 19, 9, 21, 12, 16, 8, 11, 7, 6, 5
};
static char ffslut64[] = {
64, 1, 48, 2, 57, 49, 28, 3, 61, 58, 50, 42, 38, 29, 17, 4,
62, 55, 59, 36, 53, 51, 43, 22, 45, 39, 33, 30, 24, 18, 12, 5,
63, 47, 56, 27, 60, 41, 37, 16, 54, 35, 52, 21, 44, 32, 23, 11,
@neesenk
neesenk / test.c
Created November 27, 2010 15:57
16进制打印内存的内容
/* 0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ */
void hexdump(const char *buff, int blen)
{
static char hexmap[] = "0123456789abcdef";
int offset, len, count, hexoff;
unsigned char str[58], c;
str[57] = 0, str[40] = ' ';
for (offset = 0, len = 16; offset < blen; offset += 16) {
if (blen - offset < 16) {
len = blen - offset;
@neesenk
neesenk / darray.h
Created November 28, 2010 13:21
简单的动态buff实现
#ifndef __DYNAMINC_ARRAY_H__
#define __DYNAMINC_ARRAY_H__
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#ifdef __cplusplus
extern "C" {
#endif
char *strtrim(char *str)
{
size_t len;
char *pb;
for (pb = str; isspace(*pb); pb++); /* isspace(0) == 0 */
for (len = strlen(pb); len > 0 && isspace(pb[len - 1]); len--);
if (pb > str && len > 0)
memmove(str, pb, len);
str[len] = 0;
return str;
@neesenk
neesenk / test.c
Created December 4, 2010 13:12
生成集合中的一个随机子集
/* 输出[0..n-1]的一个随机子集m */
void randselect(int *a, int m, int n)
{
while (m > 0) {
if (random() % n-- < m)
a[--m] = n;
}
}
@neesenk
neesenk / macro.h
Created December 4, 2010 15:06
比较有用的宏
/* 编译时断言, cond为编译时常量 */
#define BUILD_ASSERT(cond) do { (void) sizeof(char [1 - 2*!(cond)]); } while(0)
#define EXPR_BUILD_ASSERT(cond) (sizeof(char [1 - 2*!(cond)]) - 1)
/* 数据类型的对齐方式 == __alignof__(t) */
#define ALIGNOF(t) ((char *)(&((struct { char c; t _h; } *)0)->_h) - (char *)0)
#define container_of(ptr, type, member) \
((type *)((char *)(ptr) - (size_t)(&((type *)0)->member)))
#include <assert.h>
static inline int prefix_cmp(char *prefix, char *str)
{
unsigned char *p = (unsigned char *)prefix;
unsigned char *s = (unsigned char *)str;
while (*p && *s && *p == *s)
p++, s++;
return (*p == 0) ? 0 : *p - *s;
@neesenk
neesenk / reserve.c
Created June 27, 2011 16:22
交换数组的两部分
#include <stddef.h>
#define TYPE_SWAP(a,b) do { TYPE t = (a); (a) = (b); (b) = t; } while (0)
static inline void _reverse(TYPE *base, size_t n)
{
size_t i = 0;
for (i = 0; i < n/2; i++)
TYPE_SWAP(base[i], base[n - i - 1]);
}
@neesenk
neesenk / jstemplate.js
Created October 8, 2011 09:57
js前端的模版
/**
* js前端的模版
* zhiyongliu <zhiyongliu@tencent.com>
*
* 支持两种指令: <!-- -->, <!--{}-->
* 1. <!-- --> js的控制结构的代码;不包含输出
* 2. <!--{}--> 输出的内容, 结果为string或可转换为string的表达式
*/
var MyTemplate = MyTemplate || function(id) {
var analyze = function (str) {
@hellerbarde
hellerbarde / latency.markdown
Created May 31, 2012 13:16 — forked from jboner/latency.txt
Latency numbers every programmer should know

Latency numbers every programmer should know

L1 cache reference ......................... 0.5 ns
Branch mispredict ............................ 5 ns
L2 cache reference ........................... 7 ns
Mutex lock/unlock ........................... 25 ns
Main memory reference ...................... 100 ns             
Compress 1K bytes with Zippy ............. 3,000 ns  =   3 µs
Send 2K bytes over 1 Gbps network ....... 20,000 ns  =  20 µs
SSD random read ........................ 150,000 ns  = 150 µs

Read 1 MB sequentially from memory ..... 250,000 ns = 250 µs