2009-09-15 12 views
0

두 개의 sqlite DB를 비교하고 json 형식으로 diff를 생성하는 OS X 용 objective-c 응용 프로그램이 있습니다. DB는 꽤 큽니다 (많은 필드가있는 10,000 개의 항목). 때때로이 응용 프로그램은 약 55 초 (CPU의 95 % 사용)로 실행됩니다. 때로는 약 8 분이 소요됩니다 (CPU의 12 % 사용). 이것은 동일한 DB의 것입니다. 그것이 cpu의 단지 작은 부분을 사용할 때 나머지는 유효하다. 이 프로세스보다 우선 순위가있는 것은 없습니다. 명령에 "nice -20"을 추가하면 CPU 사용량을 확보 할 수 있습니다. 다른 아무것도 이 내 애플 의 그것을 이용하지 않는 이유는 CPU를 사용하지 않으면 내 질문 OS X에서 CPU 시간 얻기

  1. 이다?

  2. 프로그래밍 방식으로 이것을 변경할 수 있습니까?

  3. OS X에서 수행 할 수있는 작업이 있습니까? 변경 하시겠습니까?

+0

db 파일의 크기는 얼마나됩니까? 진행 상황의 메모리 사용량 (가상 크기, 상주 크기, 상단 출력보기)은 어떻게됩니까? –

답변

4

질문 1 : 코드는 디스크 읽기에 차단하기 때문에 이후

, 당신이 디스크에서 데이터베이스에 읽을 필요, 가정, 당신은 CPU의 전체를 사용하고 있지 않습니다. Mac OS X에는 많은 CPU 시간을 사용하지 않고 Spotlight와 같은 많은 디스크 읽기를 보내는 백그라운드에서 실행되는 많은 것들이 있습니다.

질문 2 :

아마하지, 다른 하나는 디스크 액세스의 가장 효율적인 사용을 가능하게보다.

질문 3 :

디스크에 액세스하는 다른 프로세스를 종료합니다. 여기에는 정말로 종료하지 말아야 할 많은 시스템 프로세스가 포함되어 있으므로 Mac OS X의 모든 허구가 없어도 Darwin에서 실행 해보는 것 이외에 다른 작업을 수행 할 수 있다고 생각하지 않습니다.

+0

또 다른 가능성 : 당신은 데이터베이스를 메모리로 끌어 당기고 있습니다. 메모리를 필요로하는 다른 것들이 있기 때문에 당신이 액세스 할 때 페이징 아웃을 할 수 있습니다. 메모리를 사용하는 다른 방법이없고 전체 데이터베이스가 메모리에 들어가면 빠른 실행을 얻습니다. 그것은 모두 데이터베이스를 읽는 코드에 달려 있습니다. –

1

오랫동안 IO 바인딩이있는 것 같습니다. 기계에서 다른 일을하고 있습니까? CPU가 스스로를 조절하지 않고 있습니다. 확실히 기다리고 있습니다.

일부 개발자 도구를 사용하면 실행 중에 앱을 볼 수 있습니다. 아마도 가장 유용한 도구는 dtrace 위에있는 GUI 인 "Instruments"입니다. 가장 최근의 Xcode를 사용하고 있다면 이것을 설치해야합니다. 언뜻보기에는 다소 사용하기 쉬운 상어를 사용할 수 있지만 장기적으로는 유익하지 않습니다.

+0

나는 상어에 대한 논평에 절대 동의하지 않는다. 상어는 내 의견으로는 시스템 성능, 특히 시스템 호출, 페이지 결함 등을 추적하는 데 가장 좋은 도구입니다.그리고 Instruments와는 달리 샘플링 할 때 정확한 스레드 상태를 보여줍니다. –

+0

아마도 Joe는 "시스템 성능"을 원하지 않습니다. 적어도 문제를 제대로 판단 할 수는 없습니다. 그가 원했던 것은 어플리케이션 특성화로서 인스 트루먼 트를 통해 얻는 것이 가장 좋습니다. 다른 한편으로, 나는 문제를 판단하는 것에 완전히 틀릴 수있다. –

1

일반적으로 모든 성능을 사용할 수 있습니다. CPU가 100 %가 아닌 경우 블로킹이 발생합니다. 데이터베이스의 경우 종종 잠금 상태가됩니다. 상어를 사용하여 응용 프로그램에서 진행중인 작업을 확인하십시오.

1

프로그램이 CPU를 거의 사용하지 않을 때, 특히 다른 프로세스가 동시에 디스크에 액세스 할 때 디스크를 기다리고 있기 때문일 수 있습니다. 또 다른 가능성은 프로그램이 너무 많은 메모리를 사용하고 OS가 스왑 공간을 사용하기 시작한다는 것입니다.