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
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
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