diff options
Diffstat (limited to 'third_party/rust/mio/test/benchmark.rs')
-rw-r--r-- | third_party/rust/mio/test/benchmark.rs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/third_party/rust/mio/test/benchmark.rs b/third_party/rust/mio/test/benchmark.rs new file mode 100644 index 0000000000..1e4fac517c --- /dev/null +++ b/third_party/rust/mio/test/benchmark.rs @@ -0,0 +1,80 @@ +use std::mem; +use mio::net::{AddressFamily, Inet, Inet6, SockAddr, InetAddr, IPv4Addr, SocketType, Dgram, Stream}; +use std::io::net::ip::IpAddr; +use native::NativeTaskBuilder; +use std::task::TaskBuilder; +use mio::os::{from_sockaddr}; +use time::Instant; +use std::vec::*; +use std::io::timer; + +mod nix { + pub use nix::c_int; + pub use nix::fcntl::{Fd, O_NONBLOCK, O_CLOEXEC}; + pub use nix::errno::{EWOULDBLOCK, EINPROGRESS}; + pub use nix::sys::socket::*; + pub use nix::unistd::*; + pub use nix::sys::epoll::*; +} + +fn timed(label: &str, f: ||) { + let start = Instant::now(); + f(); + let elapsed = start.elapsed(); + println!(" {}: {}", label, elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1_000_000_000.0); +} + +fn init(saddr: &str) -> (nix::Fd, nix::Fd) { + let optval = 1i; + let addr = SockAddr::parse(saddr.as_slice()).expect("could not parse InetAddr"); + let srvfd = nix::socket(nix::AF_INET, nix::SOCK_STREAM, nix::SOCK_CLOEXEC).unwrap(); + nix::setsockopt(srvfd, nix::SOL_SOCKET, nix::SO_REUSEADDR, &optval).unwrap(); + nix::bind(srvfd, &from_sockaddr(&addr)).unwrap(); + nix::listen(srvfd, 256u).unwrap(); + + let fd = nix::socket(nix::AF_INET, nix::SOCK_STREAM, nix::SOCK_CLOEXEC | nix::SOCK_NONBLOCK).unwrap(); + let res = nix::connect(fd, &from_sockaddr(&addr)); + let start = Instant::now(); + println!("connecting : {}", res); + + let clifd = nix::accept4(srvfd, nix::SOCK_CLOEXEC | nix::SOCK_NONBLOCK).unwrap(); + let elapsed = start.elapsed(); + println!("accepted : {} - {}", clifd, elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1_000_000_000.0); + + (clifd, srvfd) +} + +#[test] +fn read_bench() { + let (clifd, srvfd) = init("10.10.1.5:11111"); + let mut buf = Vec::with_capacity(1600); + unsafe { buf.set_len(1600); } + timed("read", || { + let mut i = 0u; + while i < 10000000 { + let res = nix::read(clifd, buf.as_mut_slice()); + assert_eq!(res.unwrap_err().kind, nix::EWOULDBLOCK); + i = i + 1; + } + }); +} + +#[test] +fn epollctl_bench() { + let (clifd, srvfd) = init("10.10.1.5:22222"); + + let epfd = nix::epoll_create().unwrap(); + let info = nix::EpollEvent { events: nix::EPOLLIN | nix::EPOLLONESHOT | nix::EPOLLET, + data: 0u64 }; + + nix::epoll_ctl(epfd, nix::EpollCtlAdd, clifd, &info); + + timed("epoll_ctl", || { + let mut i = 0u; + while i < 10000000 { + nix::epoll_ctl(epfd, nix::EpollCtlMod, clifd, &info); + i = i + 1; + } + }); + +} |