C++ 코드 내에서 system() 함수를 사용하는 것이 소스 코드를 사용하는 것보다 빠른 방법인가요?

C++ 코드 내에서 system() 함수를 사용하는 것이 소스 코드를 사용하는 것보다 빠른 방법인가요?

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

나는 내 C++ 프로그램에서 사용하고 싶습니다. 나는 espeakespeak가 내가 전달한 각 문자열을 읽는 것을 좋아합니다( 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에 대해 잘 모르기 때문에 일반적인 용어로 대답하려고 노력할 것입니다.

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

관련 정보