Является ли использование функции system() внутри кода C++ более быстрым способом, чем использование исходных кодов?

Является ли использование функции system() внутри кода C++ более быстрым способом, чем использование исходных кодов?

Насколько я знаю, я могу использовать system()функцию для использования команд терминала Linux внутри моего кода C++. Например 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. Наконец, программа будет выполнена.

Таким образом, пункты с 1 по 3 (а может быть, и 4) являются накладными расходами при использовании system(), в отличие от запуска той же функциональности в исходном коде.

Если вы найдете способ вызвать ту же функциональность espeakпосредством вызова функции в своей программе, то вы получите более быстрое время отклика.

Я не разбираюсь в espeak, поэтому постараюсь ответить в общих чертах.

  • Во-первых, не всегда легко иметь ту же функциональность работающей программы в исходном коде. Некоторые программы имеют свою функциональность, распределенную по множеству опций, и может быть сложно понять это и создать функцию в вашем коде, чтобы сделать то, что вы можете легко выразить им через командную строку;
  • Во-вторых, вам придется оценить выгоду от преобразования. С нынешними высокопроизводительными процессорами и обилием памяти запуск оболочки, а затем вашей программы, возможно, не займет слишком много времени. Эти накладные расходы особенно незначительны, если вы будете запускать всего espeakнесколько раз, с относительно длинным текстом для озвучивания.

Связанный контент