[Sitecore]GetAncestorsとpaths.LongIDの比較

概要:現在のアイテムがコンテンツツリー上の位置を特定する際によく使用するGetAncestorsと paths.LongIDの比較


検証環境は次の通りです。

  • Sitecore

 

サイトを構築して行くうちによく現在のアイテムがコンテンツツリーの位置を特定する場合あります。よく使われるのはGetAncestorsまたpaths.LongIDとなります。同僚にどれが早いのかと聞かれ、いい質問だねと思って、比較をしてみました。

下準備

下記のサンプルアイテムを作成します。

20150219_01

GetAncestors

サイトコアのコンテンツ API クックブックによりますと、GetAncestorsメソッドにて祖先にアクセスができると書かれています。

20150219_02
上記の例でLevelDアイテムの先祖をGetAncestorsで取得するとSitecore.Data.Items.Itemオブジェクト配列が返される20150219_03

Sitecore.Data.ItemPath.LongID

上記の例でLevelDアイテムのSitecore.Data.ItemPath.LongIDプロパティが Sitecore.Data.Items.ItemのオブジェクトIDの文字列を返されます。

20150219_04

コードの比較

さて、どちらか早いのかを知るにはコードを見てみましょう。両方のコードを見る限りでは両方とも、“Sitecore.Data.Managers.ItemManager” クラスを使用し、同じようなループが
使用されています。

20150219_05

検証

コードみるには同じようなループが使用していますが、返り値がオブジェクト配列に対して、文字配列を返す方が早いはずです。実際に検証してみましょう。。。下記のコードで同じ開始するアイテムから祖先にマッチするアイテムを見つけることをループに入れて、かかる時間を比較します。

20150219_06

その結果、Paths.LongIDの方がGetAncestorsより8倍も早かった。これは使用されるサーバーのリソース、メモリ、CPUなどにも影響されますが、ただ、Paths.LongIDの方早いのは間違いがないようです。。。

Test

GetAncestors

Paths.LongID

1

136ms

14ms

2

131ms

12ms

3

149ms

22ms

4

152ms

16ms

5

140ms

21ms

平均:

142ms

17ms

GetAncestorsItemPathを合わせてテストもしましたが、逆に20msほど遅かった。

if (startFrom.Axes.GetAncestors().Any(ancestor => ancestor.Paths.Path.Equals("/sitecore/content/Home/Level A")))

 

結論

Paths.LongIDの方が早いので、常にPaths.LongIDを使うべきとは、一括に言えません。確かにSitecore.Data.ItemPathクラスにあるメソッドの実行速度が速い、なぜなら、その返り値は “string” また “bool”になります。その一方で“Sitecore.Data.Items.ItemAxes”クラスにアイテムの配列を取得する便利なメソッドが含まれ、アイテムのプロパティの読み取り、書き込みができます。また、コード自体も読みやすい。サイトのビジネスの要求に合わせて使用すればいいのですが、もし、特定のアイテムを使用することを前提でかつ、速度を追求する場合はitecore.Data.ItemPath” クラスを使用しましょう。

Uncategorized