2008-09-17 30 views
32

trong quá trình xử lý XSLT, có sự khác biệt hiệu suất giữa mẫu áp dụng và mẫu cuộc gọi không? Trong bảng định kiểu của tôi, có rất nhiều trường hợp mà tôi có thể sử dụng, đó là lựa chọn tốt nhất?Hiệu suất: mẫu gọi so với mẫu áp dụng

+1

cung cấp một ví dụ như vậy ít nhất một số so sánh có thể được thực hiện – Pacerier

Trả lời

10

mẫu áp dụng và mẫu gọi không thực hiện cùng một tác vụ, so sánh hiệu suất không thực sự có liên quan ở đây. mẫu gọi lấy tên mẫu làm tham số trong khi áp dụng mẫu có biểu thức xpath. Do đó, việc áp dụng mẫu sẽ mạnh hơn rất nhiều vì bạn không thực sự biết được khuôn mẫu nào sẽ được thực hiện. Bạn sẽ nhận được các vấn đề hiệu suất nếu bạn sử dụng các biểu thức xpath phức tạp. Tránh "//" trong các biểu thức xpath của bạn vì mọi nút trong tài liệu đầu vào của bạn sẽ được đánh giá.

+1

1 - Tôi không có dữ liệu thực sự nhưng tôi khá chắc chắn '//' không chỉ chậm, mà còn [mùi] (http: //en.wikipedia.org/wiki/Code_smell) không hợp lệ. –

4

Nó có thể phụ thuộc vào trình phân tích cú pháp xml bạn đang sử dụng. Tôi không thể nói cho bất cứ điều gì, nhưng phân tích cú pháp .NET 2003, nơi tôi đã thực hiện một số thử nghiệm hiệu suất không chính thức trên mã số push vs pull XSLT. Điều này tương tự như những gì bạn đang yêu cầu: apply-template = push và call-template = pull. Tôi đã bị thuyết phục đẩy sẽ nhanh hơn, nhưng đó không phải là trường hợp. Đó là về ngay cả.

Rất tiếc, tôi không có các thử nghiệm chính xác ngay bây giờ. Tôi khuyên bạn nên thử nó ra với phân tích cú pháp của bạn lựa chọn và xem nếu có bất kỳ sự khác biệt lớn. Đặt cược của tôi là sẽ không có.

57

Giống như tất cả các câu hỏi về hiệu suất, câu trả lời sẽ tùy thuộc vào cấu hình cụ thể của bạn (cụ thể là bộ xử lý XSLT bạn đang sử dụng) và loại xử lý bạn đang thực hiện.

<xsl:apply-templates> nhận một chuỗi các nút và thực hiện từng bước một. Đối với mỗi loại, nó định vị khuôn mẫu có mức độ ưu tiên cao nhất phù hợp với nút và gọi nó. Vì vậy, <xsl:apply-templates> giống như một <xsl:for-each> với một bên trong <xsl:choose>, nhưng nhiều mô-đun hơn.

Ngược lại, <xsl:call-template> gọi mẫu theo tên. Không có sự thay đổi nào đối với nút ngữ cảnh (không có <xsl:for-each>) và không có lựa chọn nào về việc sử dụng mẫu nào.

Vì vậy, với chính xác hoàn cảnh tương tự, bạn có thể tưởng tượng rằng <xsl:call-template> sẽ nhanh hơn vì nó hoạt động ít hơn. Nhưng nếu bạn đang ở trong một tình huống có thể sử dụng <xsl:apply-templates> hoặc <xsl:call-template>, có thể bạn đang tự mình làm <xsl:for-each><xsl:choose>, trong XSLT, thay vì bộ vi xử lý làm việc đó cho bạn, đằng sau hậu trường. Vì vậy, cuối cùng tôi đoán nó có thể sẽ cân bằng. Nhưng như tôi nói nó phụ thuộc rất nhiều vào loại tối ưu hóa bộ vi xử lý của bạn đã đưa vào vị trí và chính xác những gì bạn đang xử lý. Đo nó và xem.

quy tắc của ngón tay cái về khi sử dụng phù hợp với các mẫu và khi nào sử dụng tên mẫu là:

  • sử dụng <xsl:apply-templates> và phù hợp với các mẫu nếu bạn đang xử lý các nút riêng biệt để tạo ra một kết quả; các chế độ sử dụng nếu một nút cụ thể cần được xử lý theo nhiều cách khác nhau (như trong bảng nội dung so với phần thân của tài liệu)
  • sử dụng <xsl:call-template> và mẫu được đặt tên nếu bạn đang xử lý thứ gì đó khác với nút riêng lẻ, chẳng hạn như chuỗi hoặc số hoặc bộ nút
  • (trong XSLT 2.0) sử dụng <xsl:function> nếu bạn đang trả lại một giá trị nguyên tử hoặc một nút hiện
+1

cảm ơn bạn đã giải thích rằng hoạt động trên nút ngữ cảnh hiện tại –

Các vấn đề liên quan