🚀

C++BuilderのTTimerで並列処理されるか検証

2023/12/05に公開

はじめに

C++Builderにおいて、メインスレッドの処理を早めるためTTimerを使って並列処理を行っているという話を受けて検証した。

検証条件

  • メインスレッドのみで行う(並列プログラミングライブラリを使用しない)
  • あらかじめ負荷の高い処理をTTimerのイベントに記述しトリガーする

検証方法

  • 検証ボタンを押下後、Timer1をトリガーすると同時にfunc1(3秒停止する程度の処理)を複数回実行する。
  • 本当にfunc1()の背後でTimer1の処理が実行されているのなら"func1 complete!!"が4回出力される間に"Timer1 Execute"が数十回出力されるはず。

サンプルコード

対戦お願いします。

//---------------------------------------------------------------------------
void __fastcall func1(void) {
	for (int i = 0; i < 1000000000; i++) {}    // 3秒程度の負荷
	Form1->Memo1->Lines->Add("func1 complete!!");
}
//---------------------------------------------------------------------------
// 検証ボタン押下
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Timer1->Enabled = true;
	Memo1->Lines->Add("0");
	func1();    // 3秒程度の負荷
	func1();    // 3秒程度の負荷
	func1();    // 3秒程度の負荷
	func1();    // 3秒程度の負荷
	Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
	Memo1->Lines->Add("Timer1 Execute");   // 50ms cycle
}
//---------------------------------------------------------------------------

実行結果

そうでしょうね。

0
1
2
3
4

結論

  • TTimerを使っても並列処理が行われることはない
  • オーバヘッドを考慮すると確実にべた書きよりも実行速度は悪化する
  • 処理速度を出したい場合は、プログラムコードの見直し、あるいは並列プログラミングライブラリを使用すること

Discussion