Entity 리스트의 Update 함수를 실행해야 하는데
싱글쓰레드로 0번인덱스부터 Update 를 호출한거랑
쓰레드 코어 개수로 청크 나눠서 0번 청크를 0번 쓰레드가 돌리는 방식하고 비교했을 때
싱글쓰레드가 더 빠르던데 왜 그런걸까요
청크를 나누고 각각에서 업데이트 된 리스트를 병합하는 과정에서 느려진걸까요?
대략 코드는 이렇습니다
1초에 14000루프가 대략 10000루프로 감소했습니다
싱글쓰레드로 0번인덱스부터 Update 를 호출한거랑
쓰레드 코어 개수로 청크 나눠서 0번 청크를 0번 쓰레드가 돌리는 방식하고 비교했을 때
싱글쓰레드가 더 빠르던데 왜 그런걸까요
청크를 나누고 각각에서 업데이트 된 리스트를 병합하는 과정에서 느려진걸까요?
대략 코드는 이렇습니다
1초에 14000루프가 대략 10000루프로 감소했습니다
코틀린은 안해봤는데 일반적으로 싱글 스레드보다 멀티 스레드가 더 느린 경우는 데이터가지고 경합 발생해서 그럼. 보통 그런 자료구조는 thread-safe하다고 홍보함
이거 함수형으로 짜서 모든 코드가 읽기와 생성 작업만 하는데 경합이 발생할 경우가 있을까요?
함수 내용이 ㅈ밥이라 오히려 스레드 생성 시간이 더 긴 경우?
이거 코루틴이라 쓰레드풀에서 코루틴 오브젝트만 바꿔치기 하는거긴 합니다
어디서 락 거는거 있는거 아닌가
제가 답변할만한 짬은 아니지만. 멀티스레드가 싱글스레드에 비해 우위를 가질 수 있는 부분은 단 하나임. 싱글스레드로 돌릴때 밑도 끝도 없이 오랜 시간이 걸리면서 병렬 처리 가능성이 있을때임. 그런데 난 한가지 조건을 더 제시하겠음. 프로그램이 병렬 처리 작업을 시작해도 되는지 판단할때까지는 반드시 싱글스레드로 돌아야 함. 왜냐하면 별도의 코드를 작성하지 않는 한 스레드 하나하나가 작업을 시작해도 되는지 판단할 수 없기 때문임. 그럼 싱글스레드가 다른 스레드에 작업 시작해도 된다고 신호를 스레드 개수만큼 보내야 함. 어지간히 큰 테스트 코드가 아닌 이상 이 부분의 오버헤드가 꽤 커서 모든 작업자 스레드에 신호를 보내기 전에 처음으로 시작한 스레드는 이미 처리가 끝나있거든...
멀티스레드가 싱글스레드에 비해 우위를 가질 수 있는 부분은 단 하나임. => 아님.
멀티스레드 쓰는 이유는 두가지임 1. 성능 2. 태스크간 간섭을 막아서 버그를 줄이기 위해서.. 2번 사용예가 더 많음
태스크간 간섭을 막아 버그를 줄인다는 게 어떤 건지 예시 가능할까요?
병렬처리때문에만 멀티쓰레드를 사용하면 왜 유저쓰레드 개념이 나왔을까 ㅋㅋ 초창기 멀티쓰레딩에서 그린쓰레드가 나온 이유만 살펴보더라도 병렬성만 장점이라고 하는건 아닌듯.
gui만 하더라도 멀티쓰레딩인데 여기서뭔 병렬성이 필요함. 걍 concurrency만 보장하면되는건데 실행단위를 나누는건 위에서 말한거 같이 로직분리를 통해 버그를 줄이고 재사용성을 늘이기 위함이고 멀티프로세스보다 멀티쓰레딩이 오버헤드가 적고 가능하다면 유저레벨에서도 스케줄링에 관여하려고 쓰는거임
청크 나누고 합치는 오버헤드때문인듯. 리스트 말고 reactor 쓰셈
false sharing