アセットのデータ取得方法によるパフォーマンス測定(その1)

今、世界はクリスマスムードにつつまれています。クリスマスツリー、クリスマスケーキ、クリスマスプレゼント、クリスマスソング、クリスマスパーティ、クリスマスイベント、クリスマスセールなどなどクリスマスがつくものが楽しさあふれでていますね。

そこで今回は、アセット(フレックスファミリーアセット)のデータを取得するのに、より速い取得の方法はないか調べて、皆様にお届けしたいと思います。christomas_1

たくさんのアセットを参照しているページは、キャッシュがきれている状態でページへアクセスすると、少し重く感じられますよね。少しでも早くページが表示されるように、パフォーマンスを考慮した実装が必須になります。今回は、フレックスアセットのデータの取り方に絞って探ってみようと思います。

今回は、WCSで用意されているタグを使って調べてみます。

データの取得にはassetset:getattributevaluesタグと、assetset:getmultiplevaluesタグが用意されています。この2つのタグの処理時間に違いはあるのでしょうか。2つのタグを使って処理時間を計測し、どちらのタグが速い処理を行っているか測ってみます。

アセット1コのデータを取得しただけでは、わからないので、アセット10コ、50コ、100コで計測してみましょう。

データの取得は、アセットがもつ属性から適当に5つ(string型4つ、asset型1つ)を選んでみます。

では、テスト用のテンプレートをそれぞれ作ります。

1)assetset:getattributevaluesタグ


%><assetset:setasset name="asFlexData" type="TestAsset_C" id='<%= ics.GetVar("aidAssetId") %>' /><%

%><assetset:getattributevalues name="asFlexData" attribute="testA" listvarname="listFlexData" typename="TestAsset_A" /><%
%><ics:if condition='<%= ics.GetList("listFlexData")!=null && ics.GetList("listFlexData").hasData() %>'><ics:then><%
  %><ics:listget listname="listFlexData" fieldname="value" output="o_testA" /><%
%></ics:then></ics:if><%
%><assetset:getattributevalues name="asFlexData" attribute="testB" listvarname="listFlexData" typename="TestAsset_A" /><%
%><ics:if condition='<%= ics.GetList("listFlexData")!=null && ics.GetList("listFlexData").hasData() %>'><ics:then><%
  %><ics:listget listname="listFlexData" fieldname="value" output="o_testB" /><%
%></ics:then></ics:if><%
%><assetset:getattributevalues name="asFlexData" attribute="testC" listvarname="listFlexData" typename="TestAsset_A" /><%
%><ics:if condition='<%= ics.GetList("listFlexData")!=null && ics.GetList("listFlexData").hasData() %>'><ics:then><%
  %><ics:listget listname="listFlexData" fieldname="value" output="o_testC" /><%
%></ics:then></ics:if><%
%><assetset:getattributevalues name="asFlexData" attribute="testD" listvarname="listFlexData" typename="TestAsset_A" /><%
%><ics:if condition='<%= ics.GetList("listFlexData")!=null && ics.GetList("listFlexData").hasData() %>'><ics:then><%
  %><ics:listget listname="listFlexData" fieldname="value" output="o_testD" /><%
%></ics:then></ics:if><%
%><assetset:getattributevalues name="asFlexData" attribute="testE" listvarname="listFlexData" typename="TestAsset_A" /><%
%><ics:if condition='<%= ics.GetList("listFlexData")!=null && ics.GetList("listFlexData").hasData() %>'><ics:then><%
  %><ics:listget listname="listFlexData" fieldname="value" output="o_testE" /><%
%></ics:then></ics:if><%

2)assetset:getmultiplevaluesタグ

%><assetset:setasset name="asFlexData" type="TestAsset_C" id='<%= ics.GetVar("aidAssetId") %>' /><%

%><assetset:getmultiplevalues name="asFlexData" byasset="false" immediateonly="true" prefix="atlst"><%
  %><assetset:sortlistentry attributetypename="TestAsset_A" attributename="testA"/><%
  %><assetset:sortlistentry attributetypename="TestAsset_A" attributename="testB"/><%
  %><assetset:sortlistentry attributetypename="TestAsset_A" attributename="testC"/><%
  %><assetset:sortlistentry attributetypename="TestAsset_A" attributename="testD"/><%
  %><assetset:sortlistentry attributetypename="TestAsset_A" attributename="testE"/><%
%></assetset:getmultiplevalues><%

%><ics:if condition='<%= ics.GetList("atlst:testA")!=null && ics.GetList("atlst:testA").hasData() %>'><ics:then><%
  %><ics:listget listname="atlst:testA" fieldname="value" output="o_testA" /><%
%></ics:then></ics:if><%
%><ics:if condition='<%= ics.GetList("atlst:testB")!=null && ics.GetList("atlst:testB").hasData() %>'><ics:then><%
  %><ics:listget listname="atlst:testB" fieldname="value" output="o_testB" /><%
%></ics:then></ics:if><%
%><ics:if condition='<%= ics.GetList("atlst:testC")!=null && ics.GetList("atlst:testC").hasData() %>'><ics:then><%
  %><ics:listget listname="atlst:testC" fieldname="value" output="o_testC" /><%
%></ics:then></ics:if><%
%><ics:if condition='<%= ics.GetList("atlst:testD")!=null && ics.GetList("atlst:testD").hasData() %>'><ics:then><%
  %><ics:listget listname="atlst:testD" fieldname="value" output="o_testD" /><%
%></ics:then></ics:if><%
%><ics:if condition='<%= ics.GetList("atlst:testE")!=null && ics.GetList("atlst:testE").hasData() %>'><ics:then><%
  %><ics:listget listname="atlst:testE" fieldname="value" output="o_testE" /><%
%></ics:then></ics:if><%

※アセットを格納したリスト作成、ループ処理のコードは省略しています。

測定開始です。

・・・測定・・・測定・・・測定・・・。

出ました。結果です。

アセット数

属性数

タグ

assetset:getattributevalues

assetset:getmultiplevalues

10

5

50.8ms

43.4ms

50

5

438.2ms

256ms

100

5

922.2ms

514.4ms

※動作環境や定義がもつ属性の数によって変動はあります。正確な数値ではありません。

※同じアセットタイプ、同じ定義で、すべて異なるアセットを使っています。

※フレックスアセットの参照はassetset:setassetタグを使っています。

結果を見てみましょう。assetset:getmultiplevaluesタグが速いですね。

assetset:getattributevaluesタグは、アセット数と処理時間を見ると、単純に倍の時間がかかるというわけではなさそうですね。アセット数が多ければ多いほど、時間がかかります。アセットや条件を変更して測っても同じような結果がでました。ということで、アセットタグは、assetset:getmultiplevaluesを使うで決まりですね!メリークリスマスです!

ただ、assetset:getmultiplevaluesタグのデメリットはtext型の属性は取得できないという点です。これは仕様です。ですので、text型の属性は、assetset:getattributevaluesタグを使って取得するしかないですね。うまく使い分けをすれば、十分なパフォーマンスを得ることができると思います。

では、assetAPIを使うとどうでしょうか。タグより速いのでしょうか。

次回(3月頃を予定)はassetAPIを使って測定してみようと思います。christomas_2