2013-04-20 1 views
0

프로세스를 너무 느리게하지 않고 루프에서 어떤 인덱스가 실행 중인지 확인하는 가장 좋은 방법은 무엇입니까?느린 프로세스없이 루프의 인덱스가 실행되고 있는지 확인하는 방법은 무엇입니까?

예를 들어 나는 모든 오랫동안 공상 번호를 찾으려면 및

for(long i = 1; i > 0; i++){ 
    //block 
} 

같은 루프를하고 난 내가 실시간으로 실행되는 배우고 싶다.

내가 블록에서 알아야 할 몇 가지 방법은 매번 인쇄 중이거나 if (i % 10000)를 확인하거나 수신기를 추가하는 것입니다.

가장 빠른 방법은 다음 중 하나입니다. 아니면 비슷한 경우에 무엇을합니까? 수동으로 값에 접근 할 수있는 방법이 있습니까?

+0

"나는'나는 실시간으로 실행되고 있는지 배우고 싶다. ' 언제, 얼마나 자주 배우고 싶습니까? 어딘가에 표시하고 있습니까? –

+0

정확도가 그렇게 중요하지 않으므로 문제없이 작동하는지 확인하고 종료 시점을 예상하고 싶습니다. –

답변

1

내 최근의 경험의 대부분은 자바, 그래서 이런 식으로 뭔가를 써서

import java.util.concurrent.atomic.AtomicLong; 

public class Example { 

    public static void main(String[] args) { 
     AtomicLong atomicLong = new AtomicLong(1); // initialize to 1 
     LoopMonitor lm = new LoopMonitor(atomicLong); 
     Thread t = new Thread(lm); 
     t.start(); // start LoopMonitor 

     while(atomicLong.get() > 0) { 
      long l = atomicLong.getAndIncrement(); // equivalent to long l = atomicLong++ if atomicLong were a primitive 
      //block 
     } 
    } 

    private static class LoopMonitor implements Runnable { 
     private final AtomicLong atomicLong; 

     public LoopMonitor(AtomicLong atomicLong) { 
      this.atomicLong = atomicLong; 
     } 

     public void run() { 
      while(true) { 
       try { 
       System.out.println(atomicLong.longValue()); // Print l 
       Thread.sleep(1000); // Sleep for one second 
       } catch (InterruptedException ex) {} 
      } 
     } 
    } 
} 

대부분의 AtomicLong 구현 내가 사용하는 이유입니다, 심지어 32 비트 플랫폼에서 하나의 클럭주기를 설정할 수 있습니다 여기 원시적 인 긴 대신에 (실수로 반 세트 길이를 인쇄하고 싶지는 않습니다); 컴파일러/플랫폼 세부 정보를 살펴보고 이와 같은 것이 필요한지 확인하십시오. 그러나 64 비트 플랫폼을 사용하는 경우 사용중인 언어와 상관없이 원시 기본 언어를 사용할 수 있습니다. 수정 된 for 루프는 효율성 히트를 많이 차지하지 않습니다. 원시 long을 long에 대한 참조로 대체 했으므로 추가 한 것은 포인터 참조 해제입니다.

+0

먼저 감사드립니다. ThreadListener.java:25 : 오류 : 나는이 오류가있어 코드를 컴파일하려고 예상 >> \t t.start를(); 내가 가져온 스레드 lib, 무엇이 잘못 되었습니까? –

+0

잘 모르겠습니다 - 원래 질문으로 코드를 편집하면 다시 보게 될 것입니다. –

+0

변경하지 않고 완전히 코드입니다. 방금 수업에 붙여 넣었습니다. [link] (http://codepaste.net/hkcbd8) Windows 7 64 비트에서 Java 7 및 Sublime Text 2로 컴파일하려고했습니다. –

1

쉽지는 않지만 프로세스에 영향을 미치지 않고 값을 조사하는 유일한 방법은 다른 스레드와 공유 메모리의 루프 변수에 액세스하는 것입니다. 스레딩 라이브러리는 시스템마다 다르므로 많은 도움이되지는 않습니다 (Linux에서는 아마도 pthread를 사용할 것입니다). "모니터"스레드는 값을 1 분에 1 회 조사하고, 중간에 sleep()을 수행하여 첫 번째 스레드를 중단없이 실행할 수 있도록 할 수 있습니다.

1

다중 CPC 컴퓨터에서 비용보고를 수행하려면 인덱스를 "전역"속성 (예 : 클래스 전체)으로 설정하고 인덱스 값을 읽고보고 할 개별 스레드가 있어야합니다.
이 보고서는 타이머 기반 일 수 있습니다 (초당 5 회 정도).

Rq : '루프에 있습니까?'라는 부울이 필요할 수도 있습니다. 휘발성

1

및 캐시

당신이이 일을 위하여려고하는 경우에, 말하자면, C/C++ 및 이전 다음 제안 전역/정적 루프를 확인해야합니다 별도의 모니터 스레드를 사용 휘발성 변수. 컴파일러가 루프 변수에 대한 레지스터를 사용할지 결정하기를 원하지 않습니다. 어쨌든 일부 툴체인은 이러한 가정을합니다. 그러나 그것에 대해 명백한 해를 끼치 지 않습니다.

그리고 작은 문제가 있습니다. 별도의 모니터 스레드는 요즘 별도의 코어에서 끝날 것이며, 이는 두 개의 개별 캐시 서브 시스템이 그 값에 동의해야 함을 의미합니다. 그러면 루프의 런타임에 미치는 영향이 불가피합니다.

실제 실시간 제한?

그럼 어쨌든 실시간이 얼마나 반복적입니까? 타이밍 제약이 특정 CPU 클럭주기 내에서 실행되는 것에 의존하고있는 것은 아닌지 의심 스럽습니다.두 가지 이유는 다음과 같습니다. a) 현대 OS가 그걸 보증하는 데 거의 다가 서지 않을 것입니다. 베어 메탈에서 실행해야합니다. b) 요즘 대부분의 CPU는 요즘의 시계 속도를 등뒤로 다양하게합니다. 특정 실시간 간격에 대응하는 특정 클록주기 수.

기능이 풍부한 솔루션

그래서 실시간 요구 사항은 그 제약이없는 가정, 당신은 더 많은 능력 모니터 스레드를 수행 할 수 있습니다. 루프가 때때로 업데이트하는 세마포어로 공유 구조를 보호하고 모니터 스레드가 주기적으로 진행 상황을 검사하고보고합니다. 최상의 성능을 위해 모니터 스레드는 세마포어를 가져 와서 구조체를 복사하고 세마포어를 해제 한 다음 구조를 검사/인쇄하여 잠긴 세마포어 시간을 최소화합니다.

이전의 대답에서 제안 된 것보다이 접근법의 유일한 장점은 루프 변수의 값 이상을보고 할 수 있다는 것입니다. 루프 블록에서보고 할 정보가 더 많을 수도 있습니다.

리눅스에서 뮤텍스 세마포어가 꽤 빠릅니다. 루프 블록이 매우 가벼운 경우가 아니라면 특히 단일 루프 반복마다 공유 구조를 업데이트하는 경우 단일 뮤텍스의 런타임 오버 헤드가 현저하지 않을 수 있습니다. 알맞은 OS는 당신의 스레드를 별개의 코어에 놓을 것이지만, 좋은 형태를 위해서 모니터 스레드의 우선 순위를 루프를 실행하는 스레드보다 높게 만들 것입니다. 이렇게하면 두 스레드가 동일한 코어에서 끝나는 경우 실제로 모니터링이 수행됩니다.

관련 문제