C++

在 C++ 程式碼中使用 system() 函式與使用原始碼一樣快速嗎?

  • April 6, 2019

據我所知,我可以使用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. 您的程序將開始執行 shell;
  2. 這個 shell 會讀取你傳遞給它的命令行;
  3. shell 將啟動你傳遞給 system() 的程序——在你的情況下它是espeak
  4. 該程序將接收您傳遞給它的選項;
  5. 最後,程序將執行。

因此,當您使用 時,從 1 到 3(可能還有 4)的項目都是成本system(),而不是當您在原始碼中啟動相同的功能時。

如果您找到一種方法來espeak通過程序中的函式呼叫來呼叫相同的功能,那麼您將獲得更快的響應時間。

我不知道espeak,所以我將嘗試籠統地回答。

  • 第一,在原始碼中擁有與正在執行的程序相同的功能並不總是那麼容易。一些程序的功能分佈在無數選項中,可能很難理解這一點並在程式碼中創建一個函式來執行您可以通過命令行輕鬆表達的功能;
  • 第二,您必須評估轉型的成本效益。使用目前的高性能處理器和過多的記憶體,啟動 shell 然後您的程序可能不會花費太多時間。如果您只開始espeak幾次,並且要說相對較長的文本,那麼這種成本尤其可以忽略不計。

引用自:https://unix.stackexchange.com/questions/407109