이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 42759|회답: 5

[출처] 왜 .net/c# 작업이 Thread보다 느리나요?

[링크 복사]
게시됨 2017. 5. 3. 오후 4:40:28 | | | |
.NET 4에는 새로운 이름 공간인 System.Threading.Tasks가 포함되어 있으며, 여기에는 스레딩 기능을 추상화하는 클래스들이 포함되어 있습니다. 백그라운드에서 ThreadPool을 사용하세요. 작업은 완료되어야 할 단위의 작업을 나타냅니다. 이 유닛의 작업은 별도의 스레드에서 실행될 수도 있고, 작업을 동기식으로 시작할 수도 있으며, 이 경우 메인 튜닝 스레드를 기다려야 합니다. 작업을 사용하면 추상화 계층이 생길 뿐만 아니라 기본 스레드에 대한 많은 제어권도 얻을 수 있습니다.
업무는 해야 할 업무 일정에 있어 많은 유연성을 제공합니다. 예를 들어, 작업 완료 후 어떤 작업을 해야 하는지 '연속 작업'을 정의할 수 있습니다. 이것이 성공적인 작업과 실패의 차이를 만들 수 있습니다. 또한, 작업을 계층 구조로 배열할 수 있습니다. 예를 들어, 부모 작업은 새로운 자식 작업을 생성할 수 있습니다. 이로 인해 부모 작업을 취소하면 그 하위 작업도 취소되는 의존성이 생깁니다.


요즘은 작업 실행 방식을 사용하는 것이 인기가 많고, 고성능이며, 작업 성능이 어디에 있는지 저는 잘 모르겠습니다.

저는 직접 Task와 Thread를 테스트해봤는데, Task가 매우 느려서 성능에 큰 영향을 준다고 느꼈고, 테스트 코드는 다음과 같습니다:

이 메서드를 1000번 반복한 후, 메서드가 100밀리초 동안 블록을 진행하며, 테스트 결과는 다음과 같습니다:



결과:
스레드 실행은 188밀리초가 소요됩니다
작업 실행은 14,671밀리초가 소요됩니다


두 차량의 속도 차이는 78배입니다!!

작업이 매우 느리고, 왜 이런 현상이 발생하는지 모르겠습니다. 테스트 코드에 문제가 있는 건가요, 아니면 다른 이유가 있는 건가요? 왜 이런 일이 일어나는지 설명해 주셨으면 합니다...




이전의:ASP.NET 코어로 메시지 전송
다음:C# 병렬 계산 Parallel.For&Parallel.For
 집주인| 게시됨 2020. 10. 13. 오전 10:47:17 |
tongli1996218 2020-10-13 09:34에 게시됨
Thread와 동일한 코드를 보장하기 위해 제 연산은 다음과 같고, 위의 코드는 의사 코드입니다
추신: 추가하지 말고 'Wait' Task.Delay라고 부르세요...

네 감사해요

작업 실행 시간: 117.0357

코드를 다음과 같이 수정할 수 있습니다:

Task.Run은 내부 작업을 자동으로 해제하기 때문에 Task.Factory.StartNew를 대체합니다.
Task.WaitAll은 내부 작업이 아닌 외부 작업을 기다립니다. Task.Run을 사용하면 중첩된 작업이 없습니다.


msdn 문서를 보면, Task.Delay 메서드가 지정된 밀리초 후에 완료되는 작업을 생성한다는 것을 알 수 있습니다. (사실, 새 스레드가 생성되고, 작업이 실행될 때까지 waitit가 추가되어 기다릴 예정인데, 제가 제대로 이해한 건지 모르겠습니다.)

하이퍼링크 로그인이 보입니다.

게다가 Task와 void는 차이가 있습니다

작업은 대기 가능한 비동기 메서드를 반환합니다
void return의 비동기 방식은 기다릴 수 없고, 비동기적으로 작동하며, 언제 완료됐는지 알 수 없고, 비동기 작업 상태를 모니터링할 수도 없습니다.


참조:

하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다.

요약하자면: 코드에 문제가 있습니다. Task 메서드 내에서 Thread.Sleep을 사용하면 안 됩니다
게시됨 2020. 7. 21. 오후 1:09:29 |
저도 오늘 같은 문제를 겪었는데, AES 암호화를 멀티스레딩으로 사용했는데, Task가 Thread보다 훨씬 느려요!!
집주인이 이유를 찾았나요?
게시됨 2020. 10. 12. 오후 7:24:48 |
이 게시물은 tongli1996218이 2020-10-12 19:43에 마지막으로 편집했습니다.

소유자의 코드를 테스트한 후, 프로그램을 여러 번 시작하고 실행하면 작업 시간이 계속 줄어들고, 제 컴퓨터에서는 Thread보다 짧게 줄어들며, 이 시간 내에 Thread는 안정적입니다.

나중에 Thread.Sleep(100) 메서드가 Task에는 부정적인 영향을 주지만 Thread에는 영향을 미치지 않는다는 사실이 밝혀졌으며, Thread.Sleep(100)은 숫자 자기 추가나 waitit Task.Delay(100) 같은 시간이 많이 드는 프로그램 검증으로 대체할 수 있었습니다.

추신: Thread.Sleep은 호출 후 현재 스레드 슬라이싱 시간을 종료합니다. 예를 들어 Thread.Sleep(0)은 현재 스레드 슬라이싱 시간을 종료하고 다른 스레드로 전송하여 실행합니다. 작업 내부에는 스레드 풀이 있어 스레드의 컨텍스트 스위칭을 최적화하고 CPU 손실 시간을 줄여줍니다(특히 멀티코어 CPU 최적화 시). 반면 Thread.Sleep(100)은 작업 원래 스레드 풀의 스위칭 로직을 방해하여 많은 CPU 시간 손실을 초래합니다

Thread.Sleep(100)을 await Task.Delay(100)로 교체하면, 작업 소요 시간은 100밀리초 이상임을 알 수 있습니다. 아래와 같습니다:
private void TaskTest()
{
        스레드.수면(100);
         ... 행동을 수행하세요
}
대체
private async void TaskTest()
{
      임무 대기. 지연(100);
      ... 작업 실행은 100밀리초 이상이 걸리며, 이는 원래 Thread.Sleep(100)와 동일합니다
}




 집주인| 게시됨 2020. 10. 12. 오후 10:53:05 |
tongli1996218 2020-10-12 19:24에 게시됨
소유자의 코드를 테스트한 후, 프로그램이 시작되면 여러 번 실행하면 작업 시간이 계속 줄어들고, 제 컴퓨터에서는 Thread...

이렇게 코드를 바꿔봤어요:
Task.Delay(100000);

작업 실행 시간:14.1306 ms총 시간은 매우 짧지만, Task가 호출한 메서드는 실행을 완료하지 못했습니다.
게시됨 2020. 10. 13. 오전 9:34:33 |
이 글은 tongli1996218이 2020-10-13 09:40에 마지막으로 편집했습니다
2020-10-12 22:53에 게시됨
이렇게 코드를 바꿔봤어요:
과제 지연(100000);

Thread와 동일한 코드를 보장하기 위해 제 연산은 다음과 같고, 위의 코드는 의사 코드입니다
추신: wait.Task.Delay를 호출하고 코드를 추가하지 마세요. 작업이 열린 스레드는 즉시 반환됩니다. 계산 범위 시뮬레이션을 보장하기 위해 (int a = 0; a< 1000000; ++a){}; 대신 그런 방법들

개인 비동기 정적 공백 TaskTest()
        {
            대기 임무. 지연(100000);
             인터록드. Increment(참조 런);    잠기지만, 오버헤드는 더 적습니다
            if(run == j)
             {
                스톱워치. Stop(); 모니터링 중단
                타임스팬 타임스팬 = 스톱워치. 경과;  현재 인스턴스가 측정한 총 시간을 얻습니다
                Console.WriteLine("작업 실행 시간:" + 시간 범위. TotalMilliseconds); 총 밀리초
              }
        소요 시간도 매우 짧습니다


면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com