Outsystemsで、いろいろなループの処理時間を計測してみた


やったこと・背景

以前の投稿で、if文を使ってループを回す方法と、C#のRange()のようなアクションを自作し、それを使ってForEachでループを回す方法の2種類を試してみました。
しかし、自作したRangeアクションだとループを2つまわすことになり、性能に問題があるような気がしたので、それぞれの方法(+α)の処理時間を計測しました。
ついでにForEachの時間も計りました。
また、ExtensionでFor文を実行するのと、ServiceStudioで作ったアクションでループを回すのとで、処理時間にどれほど差が出るのか気になったので試してみました。

処理時間は、Forgeで提供されているTicksというComponentを使って計測しました。

環境

  • Outsystems11 (Personal Environment)
  • Traditional Web

計測方法・計測結果

100万回ループを回しました。
10回ずつ計測を行い、平均値を結果としています。
また、それぞれループの回数分1を足すという処理を行っています。

if文でループを回す

計測結果:1.600秒(100万回)

Rangeアクションを使ってループを回す


RangeアクションをServiceStudioで作った場合と、Extensionで作った場合で実行速度が結構違いました。

RangeアクションをServiceStudioで作った場合

Ragneアクションは以下のように実装しました。

計測結果:3.924秒(100万回)

RangeアクションをExtensionで作った場合

Rangeアクションは以下のように実装しました。
OutputParameterは、Integer型の項目のみを持つStructureのリストです。

Range.cs
public void MssRange(int ssStart, int ssLength, out RLIntegerRecordList ssIntegerList) {
    ssIntegerList = new RLIntegerRecordList();
    // TODO: Write implementation for action

    var tmpRecord = new RCIntegerRecord();

    for (int i = 1; i <= ssLength; i++) {
        tmpRecord.ssSTInteger.ssInteger = ssStart;
        ssIntegerList.Add(tmpRecord);
        ssStart += 1;
    }
 } // MssRange

計測結果:2.792秒(100万回)

(追記)
こちらの記事 で、より良い実装を紹介していただきました!
この方法だと、1.457秒(100万回)でした。

ForEachだけの実行時間

Rangeアクションを実行した後~ForEachが終わるまでの時間も計ってみました。
計測結果:1.515秒

Extensionの中でfor文を実行

100万回だと値が小さすぎてうまく計測できなかったので、このパターンだけ10憶回ループを回しました。(ちなみにこれ以外のループでは、10憶回回すと余裕でタイムアウトしてしまいます。)

ForExtension.cs
public void MssForExtension(int ssLength, out int ssSum)
{
    // TODO: Write implementation for action
    ssSum = 0;
    for (int i = 0; i < ssLength; i++)
    {
        ssSum += 1;
    };
} // MssForExtension

計測結果:2.230秒(10憶回)

やりたかったこと

最初、C#のRange()をラッピングしたExtensionを作れば今回自作したRangeアクションよりも早そうだと思ったのですが、ExtensionのOutputParameterに純粋なInt型のリストを設定できないので(やり方を知らないだけかも)結局、Range()で生成したシーケンスをRecordListの型にキャストしなきゃいけないということがわかりました。が、(For文を使わずに)RecordListの型にキャストするのは難しそうだったので断念しました…。

まとめ

if文 Range (ServiceStudio) Range (Extension) ForEach Extension
1.600秒(100万回) 3.924秒(100万回) 2.792秒(100万回) 1.515秒(100万回) 2.230秒(10憶回)

100万回のループで1秒以上かかるのはちょっと遅いなあと思いました。C#だけで実装した場合と全然速さが違いますね。