Skip to content

Instantly share code, notes, and snippets.

@pabloordonez
Created July 18, 2018 18:30
Show Gist options
  • Save pabloordonez/efef7a2a0c46e7bd5e2359903017cdcf to your computer and use it in GitHub Desktop.
Save pabloordonez/efef7a2a0c46e7bd5e2359903017cdcf to your computer and use it in GitHub Desktop.
Standard stdout on windows is really slow. Instead, getting a handle to the CONOUT$ and writing to it, can increase the speed a LOT.
[package]
name = "rustfastcmd"
version = "0.1.0"
authors = ["Pablo Ordoñez <pabloo84@gmail.com>"]
[dependencies]
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winuser", "wincon", "fileapi", "handleapi"] }
extern crate winapi;
use winapi::um::fileapi::CreateFileW;
use winapi::um::handleapi::CloseHandle;
use winapi::um::wincon::{WriteConsoleOutputCharacterW, COORD};
use std::ptr::null_mut;
use std::time::{Duration, Instant};
fn get_wstring(msg: &str) -> Vec<u16> {
use std::ffi::OsStr;
use std::iter::once;
use std::os::windows::ffi::OsStrExt;
OsStr::new(msg).encode_wide().chain(once(0)).collect()
}
fn main() {
let console_handle = unsafe {
CreateFileW(
get_wstring("CONOUT$").as_ptr(),
0x40000000,
2,
null_mut(),
3,
0,
null_mut(),
)
};
println!("{:?}", console_handle);
let raw_message = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
let mut fps_text = String::from("FPS: 0") + &raw_message;
let mut chars: u32 = 0;
let mut fps = 0;
let mut duration = Duration::from_micros(0);
loop {
fps += 1;
let now = Instant::now();
unsafe {
WriteConsoleOutputCharacterW(
console_handle,
get_wstring(&fps_text).as_ptr(),
raw_message.len() as u32,
COORD { X: 0, Y: 0 },
&mut chars as *mut u32,
)
};
duration += now.elapsed();
if duration.as_secs() > 1 {
duration = Duration::from_micros(0);
fps_text = String::from("FPS: ") + &fps.to_string() + &raw_message;
fps = 0;
}
}
unsafe { CloseHandle(console_handle) };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment