Usar a função system() dentro do código C++ é uma maneira mais rápida de usar códigos-fonte?

Usar a função system() dentro do código C++ é uma maneira mais rápida de usar códigos-fonte?

Como sei, posso usar system()a função para usar comandos do terminal Linux dentro do meu código C++. Por exemplo system("aplay sound.wav");. Não sei, posso escrever todos os comandos do Linux assim ou não, mas aplayfunciona.

Eu quero usar espeakno meu programa C++. Gosto que o espeak leia cada string que passo por ele (algo parecido com o que aplayfaz no código acima, mas respeitando as "strings"). É melhor chamá-lo por system()função ou é melhor escrever um código como este dentro do meu código C++ e alterar char* textsempre que eu quiser ler uma nova string?:

#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;
}

Qual deles é mais rápido?

Responder1

Minha resposta curta é sim.

Por favor, confirme se entendi o que você perguntou.

Por favor, considere o que acontece quando você chama o sistema:

  1. Seu programa iniciará a execução de um shell;
  2. Este shell lerá a linha de comando que você passou para ele;
  3. O shell iniciará o programa que você passou para system() - no seu caso é espeak;
  4. O programa receberá as opções que você passou;
  5. Finalmente, o programa será executado.

Portanto, os itens de 1 a 3 (e talvez 4) ficam todos sobrecarregados quando você usa system(), versus quando você inicia a mesma funcionalidade em seu código-fonte.

Se você encontrar uma maneira de chamar a mesma funcionalidade por espeakmeio de uma chamada de função em seu programa, terá tempos de resposta mais rápidos.

Não sei falar, então tentarei responder em termos genéricos.

  • Primeiro, nem sempre é fácil ter a mesma funcionalidade de um programa em execução no seu código-fonte. Alguns programas têm suas funcionalidades espalhadas por uma infinidade de opções, e pode ser difícil entender isso e criar uma função em seu código para fazer o que você pode expressar facilmente por meio da linha de comando;
  • 2º, você terá que avaliar o custo benefício da transformação. Com os atuais processadores de alto desempenho e a abundância de memória, iniciar um shell e depois seu programa possivelmente não levará muito tempo. Essa sobrecarga é particularmente insignificante se você começar apenas espeakalgumas vezes, com um texto relativamente longo para ser falado.

informação relacionada