2014-02-20 3 views
3

C++ 코드에서 외부 프로그램 호출에 대한 도움이 필요합니다.C++ : system()의 반복 호출

(JDK 패키지의) javap.exe을 내 프로그램에서 여러 번 (아마도 100 개 이상) 호출해야하지만 system("javap.exe some_parameters")은 매우 느립니다. 한 세트의 매개 변수에 매우 효과적이지만 반복되는 호출 system()은 받아 들일 수 없습니다. 하드 디스크 및 응용 프로그램을 실행하는 데 비용이 소요될 뿐이라고 생각합니다 (그러나 확실하지 않습니다).

더 나은 성능을 얻으려면 어떻게해야합니까? "javap.exe을 RAM에 저장"하고 "직접"호출 할 수 있습니까? 또는 누군가가 어떻게 Java 클래스 설명 및 메서드 서명 javap.exe없이 얻을 수 있습니다 알고있을 수 있습니다?

+2

* persistent * Java 인스턴스가 있고 JNI 호출/콜백을 통해 통신하는 옵션이 있습니까? (확실히 이런 식으로 할 수 있습니다. 문제는 매번 다른 자바 인스턴스가 필요할 때나 받아 들여질 수 있는지의 여부입니다.) – DevSolar

+0

고맙습니다. 시도해 보겠습니다. 나는 많은 자바 경험이 없다. – Dmitry

답변

6

Java VM은 실행을 시작하는 데 비용이 적게 들며 초기화가 시간의 최대 부분을 차지하고 있습니다. 다행히도 javap의 기능은 Java 코드를 통해 직접 사용할 수 있습니다. javap과 비슷한 작은 Java 응용 프로그램을 작성하면 한 번의 호출로 수천을 필요로 할 것입니다. system()를 호출

-1

그냥 쉽게,하지만 매우 비효율적 인 실행되지 않습니다되어 주로하기 때문에 (비록 ... 어쩌면 당신은 이미 하나?은 javap 결국 여러 클래스 파일을 ... 소요됩니다 사용할 수있는) 어떤 프로그램 당신이 지정합니다. 오히려 하나의 프로세스 (셸)를 시작하고 해당 셸은 매개 변수를 검사하고 두 번째 프로세스를 시작합니다.

fork() 및 을 지원하는 시스템을 사용중인 경우 성능을 향상시켜야합니다. 의사 코드 예제로 다음을 고려하십시오.

void replace_system(const char *command) 
{ 
    pid_t child = fork(); 
    if (child < 0) { 
     perror("fork:"); 
     return; 
    } 

    if (child) { 
     /* this is the parent, wait for the child to finish */ 
     while (waitpid(child, &status, options) <= 0); 
     return; 
    } 

    /* this is the new process */ 
    exec*(...); 
    perror("failed to start the child"); 
    exit(-1); 
} 

매개 변수를 정렬하려는 방법에 따라 exec * 기능 중 하나를 선택하십시오. 인수 문자열을 구성 요소로 분해하고 원하는 환경을 제공해야합니다. exec * 함수를 호출하면 정의 된 명령을 시작하는 데 오류가없는 한 해당 함수는 결코 반환되지 않습니다.

성능상의 고려 사항 외에 다른 이유로는 자녀의 표준 경로를 수정할 수 있습니다. 예를 들어, 자녀의 출력에 관심이있을 수 있습니다. stdout을 사용 가능한 파이프로 수정하면 단순히 인쇄 된 내용을 읽을 수 있습니다. 이 예제를 찾으려면 표준 popen() 호출에 대한 소스 코드를 연구하십시오.

+0

'fork' /'exec'가'system'보다 더 효율적이라고 합의했습니다. 그러나 모든 JVM 설정과 비교할 때, 나는 쉘을 통과하는 오버 헤드가 전체 런타임에서의 블립보다 많은지는 의심 스럽다. – Sneftel

+0

@Sneftel 나는 동의한다 (그리고 당신의 대답을 upvoted했다). 신호 대 잡음비에서 JVM 시작 시간은 system()의 신호에 대한 신호이지만 OP는 그가 system()을 100 회 이상 호출한다고 말합니다. 그것은 소음의 확대입니다. – mah

+0

값이 비싸면 1000 * (큰 + 작은), ** ** 작은 무시합니다. 작은 것의 최적화는 큰 반면 다른 것은 조숙하다. 비싸다 = 큰 + 거대한 * (작다)면, 작은 최적화는 시기상조가 아닐 수도 있습니다. 위의 경우 OP가 해당 문제 (최적화 작음)를 완전히 무시해야 할 때 작게 최적화하도록 알리고 있습니다. 큰 것이 존재하는 동안 그것을 향한 어떤 노력도 낭비입니다 (큰 것은 작은 것보다 훨씬 큽니다). – Yakk