3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-24

やったこと・背景

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

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

環境

  • Outsystems11 (Personal Environment)
  • Traditional Web

計測方法・計測結果

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

if文でループを回す

image.png

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

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

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

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

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

計測結果: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憶回回すと余裕でタイムアウトしてしまいます。)
image.png

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#だけで実装した場合と全然速さが違いますね。

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?