[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” また […]