C++ 코드에서 system() 함수를 사용하는 것이 소스 코드를 사용하는 것만큼 빠르나요? [폐쇄]

C++ 코드에서 system() 함수를 사용하는 것이 소스 코드를 사용하는 것만큼 빠르나요? [폐쇄]

내가 아는 한, system()함수를 사용하여 C++ 코드에서 Linux 터미널의 명령을 사용할 수 있습니다. 예를 들어 system("aplay sound.wav");. 이와 같은 모든 Linux 명령을 작성할 수 있는지는 모르겠지만 aplay그렇습니다.

espeak내 C++ 프로그램에서 사용하고 싶습니다 . 나는 espeak를 통해 전달되는 모든 문자열을 읽는 것을 좋아합니다( aplay위 코드에서 수행되는 작업과 유사하지만 "문자열"을 존중함). 함수를 통해 호출하는 것이 더 낫습니까 system(), 아니면 C++ 코드에 이와 같은 코드를 작성하고 char* text새 문자열을 읽고 싶을 때 변경하는 것이 더 낫습니까? :

#include <string.h>
#include <malloc.h>
#include <espeak-ng/speak_lib.h>


espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;



char Voice[] = {"English"};


char *text = {"this is a english test"};
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;




int main(int argc, char* argv[] ) 
{
    output = AUDIO_OUTPUT_PLAYBACK;
    int I, Run = 1, L;    
    espeak_Initialize(output, Buflength, path, Options ); 
    espeak_SetVoiceByName(Voice);
    const char *langNativeString = "en"; //Default to US English
    espeak_VOICE voice;
        memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
        voice.languages = langNativeString;
        voice.name = "US";
        voice.variant = 2;
        voice.gender = 1;
        espeak_SetVoiceByProperties(&voice);
    Size = strlen(text)+1;    
    espeak_Synth( text, Size, position, position_type, end_position, flags,
    unique_identifier, user_data );
    espeak_Synchronize( );
    return 0;
}

어느 것이 더 빠르나요?

답변1

나의 짧은 대답은 '그렇다'이다.

귀하의 질문을 이해했는지 확인해주세요.

시스템을 호출하면 어떤 일이 발생하는지 생각해 보세요.

  1. 프로그램이 셸 실행을 시작합니다.
  2. 쉘은 전달한 명령줄을 읽습니다.
  3. 쉘은 system()에 전달한 프로그램을 시작합니다. 귀하의 경우에는 espeak;
  4. 프로그램은 귀하가 전달한 옵션을 받게 됩니다.
  5. 마지막으로 프로그램이 실행됩니다.

system()따라서 사용 시 1~3(아마도 4) 항목은 소스 코드에서 동일한 기능을 실행할 때와 비교하여 오버헤드가 됩니다.

espeak프로그램에서 함수 호출을 통해 동일한 기능을 호출하는 방법을 찾으면 응답 시간이 더 빨라질 것입니다.

저는 영어를 잘 모르기 때문에 일반적인 용어로 답변해 드리겠습니다.

  • 첫째, 실행 중인 프로그램과 동일한 기능을 소스 코드에 포함하는 것이 항상 쉬운 것은 아닙니다. 일부 프로그램에는 수많은 옵션에 걸쳐 기능이 분산되어 있으므로 이를 이해하고 명령줄을 통해 쉽게 표현할 수 있는 작업을 수행하는 함수를 코드에서 생성하는 것이 어려울 수 있습니다.
  • 둘째, 전환의 비용-혜택을 평가해야 합니다. 오늘날의 고성능 프로세서와 대용량 메모리를 사용하면 셸을 시작한 다음 프로그램을 시작하는 데 그리 오랜 시간이 걸리지 않을 것입니다. espeak이 오버헤드는 몇 번만 시작하고 읽고 있는 텍스트가 비교적 긴 경우에는 특히 무시할 수 있습니다.

관련 정보