Rust - Thread 실행속도 간단 실험

숲사람·2022년 8월 20일
0

Rust

목록 보기
13/15

Thread 실행 속도에 대한 간단한 실험.

Thread 미사용

use std::thread;
use std::time::Duration;

fn main() {
    for i in 1..10 {
        println!("T: {i}");
        thread::sleep(Duration::from_millis(100));
    }   
    for i in 10..20 {
        println!("M: {i}");
        thread::sleep(Duration::from_millis(100));
    }   
}

실행 속도는 1.996s

$ time target/debug/thread
T: 1
T: 2
T: 3
T: 4
T: 5
T: 6
T: 7
T: 8
T: 9
M: 10
M: 11
M: 12
M: 13
M: 14
M: 15
M: 16
M: 17
M: 18
M: 19

real    0m1.996s
user    0m0.003s
sys     0m0.004s

Thread 사용

use std::thread;
use std::time::Duration;

fn main() {
    let t1 = thread::spawn( || {
        for i in 1..10 {
            println!("T: {i}");
            thread::sleep(Duration::from_millis(100));
        }
    });

    for i in 10..20 {
        println!("M: {i}");
        thread::sleep(Duration::from_millis(100));
    }   
    t1.join().unwrap();
}

실행속도는 1.033s. 정확히 두배 차이. 동시성 문제가 고려되는 상황이 아니라면 이런경우 Thread를 사용하지 않을 이유가 없는 건가?

$ time target/debug/thread
M: 10
T: 1
M: 11
T: 2
M: 12
T: 3
M: 13
T: 4
M: 14
T: 5
M: 15
T: 6
M: 16
T: 7
M: 17
T: 8
M: 18
T: 9
M: 19

real    0m1.033s
user    0m0.003s
sys     0m0.005s

둘다 Thread로

use std::thread;
use std::time::Duration;

fn main() {
    let t1 = thread::spawn( || {
        for i in 1..10 {
            println!("T: {i}");
            thread::sleep(Duration::from_millis(100));
        }
    });

    let t2 = thread::spawn( || {
        for i in 10..20 {
            println!("M: {i}");
            thread::sleep(Duration::from_millis(100));
        }
    });

    t1.join().unwrap();
    t2.join().unwrap();
    
    /* (A) */
}

실행 속도 1.045s. 둘 중 하나만 Thread화 하는것과 차이는 없었음.

참고로 마지막에 t1.join().unwrap() 는 t1 thread가 종료될때까지 기다리는 지점. join이 없다면 결과는 아무것도 출력되지 않음. Thread가 종료되기 전에 프로그램 main() 이 먼저 종료되기 때문. 만약 이 뒤에 어떤 동작 (A)가 있다면 t1 Thread가 종료된 뒤에 실행된다.

join이라는 단어를 모든 프로그래밍 언어의 Thread에서 사용해서 그의미가 궁금했는데. Thread로 분기했다가 다시 만난다(join)는 의미를 갖지 않나 싶음. 또한 spawn은 알을 낳다. (어떤 결과 상황을) 낳다. 라는 사전적 의미를 가짐. Thread에서 사용하기 딱 적합한 키워드.

$ time target/debug/thread
T: 1
M: 10
T: 2
M: 11
T: 3
M: 12
T: 4
M: 13
T: 5
M: 14
T: 6
M: 15
T: 7
M: 16
M: 17
T: 8
M: 18
T: 9
M: 19

real    0m1.045s
user    0m0.002s
sys     0m0.004s
profile
기록 & 정리 아카이브용

0개의 댓글