[Sitecore]GetAncestorsとpaths.LongIDの比較
概要:現在のアイテムがコンテンツツリー上の位置を特定する際によく使用するGetAncestorsと paths.LongIDの比較
検証環境は次の通りです。
- Sitecore 8
サイトを構築して行くうちによく現在のアイテムがコンテンツツリーの位置を特定する場合あります。よく使われるのはGetAncestorsまたpaths.LongIDとなります。同僚にどれが早いのかと聞かれ、いい質問だねと思って、比較をしてみました。
下準備
下記のサンプルアイテムを作成します。
GetAncestors
サイトコアのコンテンツ API クックブックによりますと、GetAncestorsメソッドにて祖先にアクセスができると書かれています。
上記の例でLevelDアイテムの先祖をGetAncestorsで取得するとSitecore.Data.Items.Itemオブジェクト配列が返される
Sitecore.Data.ItemPath.LongID
上記の例でLevelDアイテムのSitecore.Data.ItemPath.LongIDプロパティが Sitecore.Data.Items.ItemのオブジェクトIDの文字列を返されます。
コードの比較
さて、どちらか早いのかを知るにはコードを見てみましょう。両方のコードを見る限りでは両方とも、“Sitecore.Data.Managers.ItemManager” クラスを使用し、同じようなループが
使用されています。
検証
コードみるには同じようなループが使用していますが、返り値がオブジェクト配列に対して、文字配列を返す方が早いはずです。実際に検証してみましょう。。。下記のコードで同じ開始するアイテムから祖先にマッチするアイテムを見つけることをループに入れて、かかる時間を比較します。
その結果、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 |
GetAncestorsとItemPathを合わせてテストもしましたが、逆に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” クラスを使用しましょう。