🚀
C++BuilderのTTimerで並列処理されるか検証
はじめに
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