0

그래서 코드를 실행하고 성능을 향상시키고 싶습니다. 삭제를 완료하는 데 꽤 오랜 시간이 걸리고 (약 0.003 초) 다른 스레드에 넣고 배열을 삭제하기로 결정했습니다.다음 코드에서 dispatch_async 성능에 영향을 줍니까?

이제 스레드를 생성하고 실행하는 데 걸리는 시간이 배열을 삭제하는 것보다 훨씬 빠릅니다.하지만 이제는 스레드를 만든 다음 코드가 성능에 영향을 미치므로 실행하는 데 2 ​​~ 3 배 정도 더 오래 걸립니다.

왜 이런 일이 벌어지고 있으며 성능이 어떻게 향상 될 수 있는지 알고 있습니까? 내가 전에는 오직 Mac에서 코딩을했기 때문에 dispatch_async를 사용하고 있습니다. 다른 스레드를 만드는 C/C++ 라이브러리를 시도하지 않았으므로, 성능이 좋은 동일한 작업을 수행 할 수있는 대체 라이브러리를 알고 있다면, 그것을 사용하는 것으로 넘어 갈 것입니다.

clock_t start, end, start2, end2; 

start = clock(); 

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 

std::set<int> *temp = a; 
a = nullptr; 

dispatch_async(queue, ^{ 
    delete[] temp; 
}); 

//delete[] a; 

end = clock(); 

a = new std::set<int>[10000]; 

start2 = clock(); 
/* 
Code here initializes stuff inside the array a 
Code here never changes 
*/ 
end2 = clock(); 

//(end2 - start2/CLOCKS_PER_SEC) is now much longer than it was without multithreading but (end - start)/CLOCKS_PER_SEC is much faster (which is expected) 

답변

1

힙 할당자가 공유 잠금을 사용 중입니다. 동시 액세스에 대해 보호해야하는 힙 할당 메모리 (즉, malloc/free 또는 new/delete로 할당 된 메모리)를 추적하는 다양한 데이터 구조가 있습니다. 내 생각 엔 배경 스레드의 delete 작업과 start2end2 사이의 코드가 해당 잠금을 위해 경쟁하고있는 것 같습니다. 사용할 수있는 다양한 특수화 된 C++ allocators이 있지만 기본 스레드는 스레드 안전성을 가지므로 여러 스레드에서 동시 사용시 성능이 저하 될 수 있습니다.

+0

그래서 임시 변수 ('temp')를'a'와 같은 포인터로 설정 한 다음'a'를 널 포인터로 설정하여 배열의 삭제와 생성을 동시에 할 수 있습니다. 그것? – TheAmateurProgrammer

+1

변수가 무엇을 가리키고 있든 상관 없습니다. 이것은 메모리를 할당하고 해제하고 힙의 상태를 추적하는 데 필요한 정리 작업을 수행하는 시스템 내에서의 경쟁입니다. 그 누구도 당신의 변인에 대해 알고 있거나 신경 쓰지 않습니다. –

+0

나는 .. 코드의 성능을 향상시킬 수있는 방법이있을 것인가, 아니면 지금 당장 가지고있는 것을 고수 할 것인가? – TheAmateurProgrammer