#![feature(phase)]
#[phase(plugin, link)]
extern crate log;
extern crate time;
extern crate memcached;
use std::rand::random;
use std::collections::TreeMap;
use memcached::client::Client;
use memcached::proto::{Operation, MultiOperation, NoReplyOperation, Binary};
fn generate(len: uint) -> Vec<u8> {
let mut key = Vec::with_capacity(len);
for _ in (0..len) {
key.push(random::<u8>());
}
key
}
fn main() {
let mut client = Client::connect([
("127.0.0.1:11211", Binary, 1),
("127.0.0.1:11212", Binary, 3),
]);
const TOTAL_KEY: uint = 10240;
const KEY_LEN: uint = 20;
const VAL_LEN: uint = 4 * 1024;
let mut kv = TreeMap::new();
for _ in (0..TOTAL_KEY) {
kv.insert(generate(KEY_LEN), (generate(VAL_LEN), 0xcafebabe, 20));
}
info!("Test cases is generated. Total {}, Key length {}bytes, Value length {}bytes", TOTAL_KEY, KEY_LEN, VAL_LEN);
info!("Trying set with reply...");
let beg = time::now().to_timespec();
for (k, (val, flags, exp)) in kv.clone().into_iter() {
client.set(k.as_slice(), val.as_slice(), flags, exp).unwrap();
}
let end = time::now().to_timespec();
info!("set {}", end - beg);
client.flush_all().unwrap();
info!("Trying set_multi...");
let beg = time::now();
client.set_multi(kv.clone()).unwrap();
let end = time::now();
info!("set_multi {}", end.to_timespec() - beg.to_timespec());
client.flush_all().unwrap();
info!("Trying set_noreply...");
let beg = time::now();
for (k, (val, flags, exp)) in kv.clone().into_iter() {
client.set_noreply(k.as_slice(), val.as_slice(), flags, exp).unwrap();
}
let end = time::now();
info!("set_noreply {}", end.to_timespec() - beg.to_timespec());
info!("Trying get...");
let beg = time::now();
for (k, (expected, _, _)) in kv.clone().into_iter() {
let (value, _) = client.get(k.as_slice()).unwrap();
}
let end = time::now();
info!("get {}", end.to_timespec() - beg.to_timespec());
info!("Trying multi_get...");
let keys: Vec<Vec<u8>> = kv.keys().map(|k| k.clone()).collect();
let beg = time::now();
let values = client.get_multi(keys).unwrap();
for (k, (expected, flags, _)) in kv.clone().into_iter() {
let get_result = values.find(&k);
let expect = &(expected, flags);
}
let end = time::now();
info!("multi_get {}", end.to_timespec() - beg.to_timespec());
info!("Trying delete_multi...");
let keys: Vec<Vec<u8>> = kv.keys().map(|k| k.clone()).collect();
client.delete_multi(keys).unwrap();
info!("Succeed");
}