728x90
반응형
728x90
반응형
728x90
반응형

hexyl : 터미널에서 손쉽게 활용하는 현대적인 헥스(Hex) 뷰어


  • 바이너리 파일을 다룰 때 가장 필수적인 도구 중 하나는 헥스 뷰어(hexdump) 입니다.
  • 다양한 헥스 뷰어가 존재하지만, hexyl 은 단순하면서도 가독성이 뛰어난 출력 형식을 제공하는 현대적인 터미널 기반 헥스 뷰어입니다.

특징

  • 컬러 지원 : hexyl은 데이터를 유형별로 구분하여 색상으로 표시합니다. 이는 가독성을 높여 특정 패턴을 쉽게 파악할 수 있도록 도와줍니다.
  • 간단한 인터페이스 : 불필요한 기능 없이 핵심적인 역할에 집중하여 직관적으로 사용할 수 있습니다.
  • 빠르고 가벼운 성능 : Rust 언어로 개발되어 뛰어난 성능과 안정성을 제공합니다.
  • 다양한 출력 옵션 : 특정 오프셋을 지정하거나, 출력 크기를 조정하는 등의 기능을 지원합니다.

미리 보기


설치 방법

  • 대부분의 리눅스 배포판에서 hexyl을 패키지 매니저를 통해 쉽게 설치할 수 있습니다.

  • bash

      # Ubuntu / Debian
      sudo apt install hexyl
      
      # Arch Linux
      sudo pacman -S hexyl
      
      # macOS (Homebrew)
      brew install hexyl
      
      # Cargo를 이용한 설치
      cargo install hexyl
    

사용 예시

  • 기본적으로 hexyl은 파일의 헥스 덤프를 출력합니다.

  • bash

      hexyl example.bin
    

  • 특정 바이트 수만큼 출력하고 싶다면 -n 옵션을 사용할 수 있습니다.

  • bash

      hexyl -n 64 example.bin  # 처음 64바이트만 출력
    

마무리

  • hexyl은 단순하지만 강력한 기능을 갖춘 헥스 뷰어로, 터미널에서 바이너리 파일을 분석해야 하는 모든 사용자에게 유용한 도구입니다.
  • 기존 hexdump 또는 xxd를 대체할 수 있는 현대적인 대안으로 활용해 보세요. 🚀
728x90
반응형

'Rust' 카테고리의 다른 글

Rust 언어 소개  (0) 2025.02.20
Rust의 소유권(Ownership)과 이동(Move) 개념  (0) 2025.02.18
hyperfine : rust 기반 명령줄 벤치마킹 도구  (0) 2024.12.06
728x90
반응형

Rust 언어 소개

1. Rust 소개

  • Rust는 시스템 프로그래밍 언어로, 메모리 안전성을 보장하면서도 성능이 뛰어난 언어입니다. 주요 특징은 다음과 같습니다.
    • 메모리 안전성: 소유권 시스템(Ownership)과 빌림(Borrowing) 메커니즘을 사용하여 메모리 오류 방지
    • 고성능: C, C++과 비슷한 성능을 제공
    • 병렬성: 안전한 스레드 동기화 지원

2. Rust 설치

Rust는 공식 설치 도구인 rustup을 통해 설치할 수 있습니다.


설치 명령어

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

설치 후, Rust 버전을 확인하려면 다음 명령어를 사용합니다.

rustc --version

3. Rust의 기본 문법

3.1 Hello, World!

Rust 프로그램의 기본 구조는 다음과 같습니다.

fn main() {
    println!("Hello, world!");
}
  • fn main(): 프로그램의 진입점
  • println!(): 매크로를 사용하여 문자열 출력

3.2 변수와 상수

Rust에서 변수는 기본적으로 변경 가능 여부에 따라 letconst로 선언됩니다.

let mut x = 5;  // 변경 가능 변수
x = 10;

const MAX_POINTS: u32 = 100_000;  // 변경 불가능한 상수

3.3 데이터 타입

Rust는 정적 타입 언어로, 변수 선언 시 타입을 지정할 수 있습니다.

let int_num: i32 = -10;
let float_num: f64 = 3.14;
let is_active: bool = true;
let letter: char = 'A';

3.4 제어문

조건문

let number = 10;
if number > 5 {
    println!("큰 숫자입니다.");
} else {
    println!("작은 숫자입니다.");
}

반복문

for i in 0..5 {
    println!("반복: {}", i);
}

4. 함수와 소유권

4.1 함수 정의

fn add(a: i32, b: i32) -> i32 {
    a + b  // 마지막 표현식의 결과가 반환됨
}

4.2 소유권과 빌림

  • Rust의 주요 개념인 소유권(Ownership)과 빌림(Borrowing)은 메모리 안정성을 보장합니다.

소유권 이동

fn main() {
    let s = String::from("hello");
    take_ownership(s);
    // s는 여기서 사용할 수 없음
}

fn take_ownership(some_string: String) {
    println!("{}", some_string);
}

참조(&)를 통한 빌림

fn main() {
    let s = String::from("hello");
    print_string(&s);
    println!("{}", s); // s는 여전히 사용 가능
}

fn print_string(some_string: &String) {
    println!("{}", some_string);
}

5. 구조체와 열거형

5.1 구조체

struct User {
    name: String,
    age: u32,
}

fn main() {
    let user1 = User {
        name: String::from("Alice"),
        age: 30,
    };
    println!("사용자: {} ({}세)", user1.name, user1.age);
}

5.2 열거형

enum Direction {
    Up,
    Down,
    Left,
    Right,
}

fn main() {
    let dir = Direction::Up;
    match dir {
        Direction::Up => println!("위로 이동"),
        Direction::Down => println!("아래로 이동"),
        Direction::Left => println!("왼쪽으로 이동"),
        Direction::Right => println!("오른쪽으로 이동"),
    }
}

6. 정리

Rust는 강력한 메모리 관리 기능과 높은 성능을 제공하는 언어로, 시스템 프로그래밍, 웹 개발, 임베디드 프로그래밍 등 다양한 분야에서 활용됩니다. 기본 문법과 개념을 익히면 더욱 깊이 있는 활용이 가능합니다.

728x90
반응형
728x90
반응형

Rust의 소유권(Ownership)과 이동(Move) 개념

  • Rust의 소유권과 이동 개념은 메모리 안전성 을 보장하기 위한 중요한 기능입니다.

  1. 소유권(Ownership)

    • 모든 값은 정확히 하나의 소유자(owner)가 있음.
    • 소유자가 범위(Scope)를 벗어나면 메모리는 해제됨.
  2. 이동(Move)

    • 값이 다른 변수로 이동하면, 이전 소유자는 더 이상 그 값을 사용할 수 없음.

예제 코드

rust

fn main() {
    let s1 = String::from("Hello, Rust!");
    let s2 = s1; // s1의 소유권이 s2로 이동

    // println!("{}", s1); // Error: s1은 더 이상 유효하지 않음
    println!("{}", s2); // s2는 "Hello, Rust!" 출력
}

설명

  • s1에 "Hello, Rust!" 문자열을 할당.
  • s2 = s1에서 소유권이 s1에서 s2로 이동.
  • s1은 더 이상 사용할 수 없음.

복제(Clone)를 통한 복사

rust

fn main() {
    let s1 = String::from("Hello, Rust!");
    let s2 = s1.clone(); // s1의 데이터를 복제하여 s2에 할당

    println!("{}", s1); // s1 사용 가능
    println!("{}", s2); // s2 사용 가능
}
  • .clone()은 데이터를 복사하여 두 변수를 모두 사용할 수 있게 함.

이동(Move)와 복사(Copy) 타입

  • Rust는 i32 (32-bit integer) 같은 기본 타입은 Copy 트레잇을 구현하여 복사가 가능합니다.

rust

fn main() {
    let x = 10; // i32 타입
    let y = x; // x는 Copy, 이동 없이 사용 가능

    println!("{}", x); // x는 여전히 사용 가능
    println!("{}", y);
}
728x90
반응형
728x90
반응형

hyperfine : rust 기반 명령줄 벤치마킹 도구

Demo: Benchmarking fd and find:

hyperfine

특징

  • 여러 차례의 실행에 걸친 통계 분석.
  • 임의의 셸 명령 지원.
  • 벤치마크 진행 상황과 현재 추정치에 대한 지속적인 피드백.
  • 실제 벤치마크 전에 워밍업 실행을 실행할 수 있습니다.
  • 각 타이밍 실행 전에 캐시 삭제 명령을 설정할 수 있습니다.
  • 다른 프로그램과 캐싱 효과에 의한 간섭을 감지하기 위한 통계적 이상치 감지.
  • 다양한 형식으로 결과를 내보냅니다: CSV, JSON, Markdown, AsciiDoc.
  • 매개변수화된 벤치마크(예: 스레드 수 변경)
  • 크로스 플랫폼

용법

기본 벤치마크

  • 벤치마크를 실행하려면 hyperfine <command>...를 호출하기만 하면 됩니다. 인수는 다음과 같습니다.
    • 쉘 명령. 예를 들어:
    hyperfine 'sleep 0.3'
    

  • Hyperfine은 각 명령에 대해 수행할 실행 횟수를 자동으로 결정합니다.
  • 기본적으로, 최소 10번의 벤치마킹 실행을 수행하고 최소 3초 동안 측정합니다.
  • 이를 변경하려면 -r/--runs 옵션을 사용할 수 있습니다:
    hyperfine --runs 5 'sleep 0.3'
    

  • 다양한 프로그램의 런타임을 비교하려면 여러 명령을 전달할 수 있습니다.
    hyperfine 'hexdump file' 'xxd file'
    

워밍업 실행 및 준비 명령

  • 디스크 I/O를 많이 수행하는 프로그램의 경우 벤치마킹 결과에 큰 영향을 미칠 수 있습니다.
  • 디스크 캐시에 따라 콜드인지 웜인지를 판단합니다.
    • Warm Cache란 캐시가 이미 필요한 데이터를 어느 정도 포함하고 있는 상태를 말합니다. 이는 캐시가 완전히 비어 있는 차가운 캐시(Cold Cache)와 대비되는 개념입니다.

  • 따뜻한(warm) 캐시에서 벤치마크를 실행하려면 -w/--warmup 옵션을 사용할 수 있습니다.

  • 실제 벤치마크 전에 특정 수의 프로그램 실행을 수행합니다.

    hyperfine --warmup 3 'grep -R TODO *'
    

  • 반대로 콜드 캐시에 대한 벤치마크를 실행하려면 -p/--prepare를 사용할 수 있습니다.

    • 타이밍 실행 전에 특수 명령을 실행하는 옵션.
  • 예를 들어, 하드디스크 캐시를 지우려면 Linux에서는 다음을 실행할 수 있습니다.

    sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
    
  • 이 특정 명령을 hyperfine과 함께 사용하려면 sudo -v를 호출하여 일시적으로 sudo 권한을 얻으십시오.

    • 그리고 호출하세요:
    hyperfine --prepare 'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' 'grep -R TODO *'
    

매개변수화된 벤치마크

  • 단일 매개변수가 변화하는 일련의 벤치마크를 실행하려는 경우(예: 스레드)의 경우 -P/--parameter-scan 옵션을 사용하고 다음을 호출할 수 있습니다.
    hyperfine --prepare 'make clean' --parameter-scan num_threads 1 12 'make -j {num_threads}'
    

  • 이것은 10진수에도 적용됩니다. -D/--parameter-step-size 옵션을 사용할 수 있습니다.
    • 단계 크기를 제어하려면:
      hyperfine --parameter-scan delay 0.3 0.7 -D 0.2 'sleep {delay}'
      
  • 이렇게 하면 sleep 0.3, sleep 0.5, sleep 0.7이 실행됩니다.

  • 숫자가 아닌 매개변수의 경우 -L/--parameter-list를 사용하여 값 목록을 제공할 수도 있습니다.
    • 옵션:
      hyperfine -L compiler gcc,clang '{compiler} -O2 main.cpp'
      

중간 쉘 (Intermediate shell)

  • 기본적으로 명령은 미리 정의된 셸(Unix에서는 /bin/sh, Windows에서는 cmd.exe)을 사용하여 실행됩니다.
  • 다른 셸을 사용하려면 -S, --shell <SHELL> 옵션을 사용하면 됩니다.
hyperfine --shell zsh 'for i in {1..10000}; do echo test; done'
  • hyperfine은 항상 "쉘 프로세스(shell spawn time)"을 보정합니다.
    • 이를 위해 보정을 수행합니다.
    • 쉘을 빈 명령으로 여러 번 실행하여 시작 시간을 측정하는 절차 셸의.
  • 그런 다음 명령에서 사용된 실제 시간을 표시하기 위해 총 시간에서 이 시간을 뺍니다.

  • 중간 셸 없이 벤치마크를 실행하려면 -N 또는 --shell=none을 사용할 수 있습니다. 옵션입니다.
  • 이것은 셸 시작 오버헤드 수정이 필요한 매우 빠른 명령(< 5ms)에 유용합니다.
  • 상당한 양의 노이즈를 생성합니다. 이 경우 * 또는 ~와 같은 셸 구문을 사용할 수 없습니다.
hyperfine -N 'grep TODO /home/user'

쉘 함수 및 별칭

  • bash를 사용하는 경우 쉘 함수를 내보내어 hyperfine으로 직접 벤치마킹할 수 있습니다.
my_function() { sleep 1; }
export -f my_function
hyperfine --shell=bash my_function
  • 그렇지 않은 경우 벤치마크 프로그램에서 인라인으로 가져오거나 소싱합니다.
hyperfine 'my_function() { sleep 1; }; my_function'

echo 'alias my_alias="sleep 1"' > /tmp/my_alias.sh
hyperfine '. /tmp/my_alias.sh; my_alias'

결과 내보내기

  • Hyperfine에는 벤치마크 결과를 CSV, JSON, Markdown 및 기타 형식으로 내보내기 위한 여러 옵션이 있습니다.
    • 형식(자세한 내용은 --help 텍스트를 참조하세요).

마크다운

  • --export-markdown <file> 옵션을 사용하면 다음과 같은 표를 만들 수 있습니다.
Command Mean [s] Min [s] Max [s] Relative
find . -iregex '.*[0-9]\.jpg$' 2.275 ± 0.046 2.243 2.397 9.79 ± 0.22
find . -iname '*[0-9].jpg' 1.427 ± 0.026 1.405 1.468 6.14 ± 0.13
fd -HI '.*[0-9]\.jpg$' 0.232 ± 0.002 0.230 0.236 1.00

JSON

  • 벤치마크 결과를 더 자세히 분석하려는 경우 JSON 출력이 유용합니다.
  • scripts/ 폴더에는 많은 것이 포함되어 있습니다
  • 벤치마크 결과를 더욱 분석하고 유용한 정보를 생성하기 위한 유용한 Python 프로그램 런타임 히스토그램이나 비교를 위한 털 플롯과 같은 시각화 다중 벤치마크:

자세한 벤치마크 흐름도

  • 다음 차트는 옵션을 사용할 때 다양한 타이밍 실행의 실행 순서를 설명합니다.
    • --warmup, --prepare <cmd>, --setup <cmd> 또는 --cleanup <cmd>와 같이:

설치

Packaging status

우분투에서

  • 릴리스 페이지에서 적절한 .deb 패키지를 다운로드하세요.

  • dpkg를 통해 설치하세요:

wget https://github.com/sharkdp/hyperfine/releases/download/v1.19.0/hyperfine_1.19.0_amd64.deb
sudo dpkg -i hyperfine_1.19.0_amd64.deb

Fedora에서

Fedora에서는 공식 저장소에서 hyperfine을 설치할 수 있습니다.

dnf install hyperfine

Alpine Linux에서

  • Alpine Linux에서는 hyperfine을 공식 저장소에서 설치할 수 있습니다.
apk add hyperfine

Arch Linux에서

  • Arch Linux에서는 hyperfine을 공식 저장소에서 설치할 수 있습니다.
pacman -S hyperfine

데비안 리눅스에서

apt install hyperfine

Exherbo Linux에서

  • Exherbo Linux에서는 hyperfine을 rust 저장소에서 설치할 수 있습니다.
cave resolve -x repository/rust
cave resolve -x hyperfine

Funtoo Linux에서

  • Funtoo Linux에서는 hyperfine을 core-kit에서 설치할 수 있습니다.
emerge app-benchmarks/hyperfine

NixOS에서

  • NixOS에서는 hyperfine을 공식 저장소에서 설치할 수 있습니다.
nix-env -i hyperfine

플록스에 대하여

  • Flox에서는 hyperfine을 다음과 같이 설치할 수 있습니다.
flox install hyperfine
  • 플록스의 하이퍼파인 버전은 닉스의 버전을 따른다.

openSUSE에서

  • openSUSE에서는 공식 저장소에서 hyperfine을 설치할 수 있습니다.
zypper install hyperfine

Void Linux에서

  • Hyperfine은 xbps를 통해 설치 가능합니다.
xbps-install -S hyperfine

macOS에서

  • Hyperfine은 Homebrew를 통해 설치할 수 있습니다.
brew install hyperfine
  • 또는 MacPorts를 사용하여 설치할 수 있습니다.
sudo port selfupdate
sudo port install hyperfine

FreeBSD에서

  • Hyperfine은 pkg를 통해 설치할 수 있습니다:
pkg install hyperfine

OpenBSD에서

doas pkg_add hyperfine

윈도우에서

choco install hyperfine
scoop install hyperfine
winget install hyperfine

콘다를 사용하여

  • Hyperfine은 condaconda-forge 채널을 통해 설치할 수 있습니다.
conda install -c conda-forge hyperfine

카고(Linux, macOS, Windows)

  • Hyperfine은 cargo 를 통해 소스에서 설치할 수 있습니다.
cargo install --locked hyperfine
  • Rust 1.76 이상을 사용하세요.

바이너리에서(Linux, macOS, Windows)

대체 도구

  • Hyperfine은 bench 에서 영감을 받았습니다.

다른 도구와의 통합

  • Chronologerhyperfine을 사용하여 Git 기록 전체에서 벤치마크 타이밍의 변화를 시각화합니다.

  • Bencherhyperfine을 지원하는 지속적인 벤치마킹 도구입니다. CI에서 벤치마크를 추적하고 성능 저하를 포착합니다.

  • scripts folder를 확인하세요. 이 저장소에는 초정밀 벤치마크 결과를 처리하는 데 필요한 도구 세트가 있습니다.

이름의 유래

  • hyperfine (초미세) 라는 이름은 세슘 133의 초미세 수준을 참조하여 선택되었습니다. 이 초미세 수준은 중요한 역할을 합니다.

  • 시간의 기본 단위 정의

하이퍼파인을 인용하다

  • 귀하의 연구 작업에서 hyperfine을 인용하는 것을 고려해 주셔서 감사합니다. 정보를 참조하십시오.
  • 사이드바에서 Hyperfine을 올바르게 인용하는 방법을 알아보세요.

라이센스

  • hyperfine은 MIT 라이선스와 Apache 라이선스 2.0의 조건에 따라 이중 라이선스를 받습니다.

  • 자세한 내용은 LICENSE-APACHELICENSE-MIT 파일을 참조하세요.

728x90
반응형

+ Recent posts