e
sv

Go şablon kitaplıkları: Bir performans karşılaştırması

avatar

Yazılım Method

  • e 0

    Mutlu

  • e 0

    Eğlenmiş

  • e 0

    Şaşırmış

  • e 0

    Kızgın

  • e 0

    Üzgün

Şablon oluşturma kitaplıkları, bir programlama dili ekosisteminin önemli bir parçasıdır. Go'nun standart kitaplığı, kutudan çıktığı gibi güçlü şablon oluşturma kitaplıkları sağlar, ancak Go'da geliştiricilerin kullanması için topluluk tarafından oluşturulmuş birden çok şablon oluşturma kitaplığı da vardır.

Mevcut birkaç seçenekle, özel kullanım durumunuz için en iyi seçimi seçmek zor olabilir.

Bu makale, Go'nun kıyaslama aracını kullanarak performans, işlevsellik ve güvenlik temelinde en popüler şablon oluşturma kitaplıklarından bazılarını karşılaştıracaktır. Spesifik olarak, şablonlarda kullanılan koşullu işlemler, şablon iç içe yerleştirme ve döngüler vb. gibi bazı yaygın işlemlere bakacağız ve size her bir şablon motorunun performansı ve bellek ayak izi hakkında bir fikir vermek için bunları kıyaslayacağız.

Bu makalenin temeli olarak, bugün geliştiriciler için kullanıma ve uygulanabilirliğe dayalı olarak dört Go şablonlama kitaplığı kullanmaya karar verdim, çünkü diğerleri önceden derlenmiş veya seyrek olarak bakımı yapılmıştır. Bugün karşılaştıracağımız kütüphaneler template/text , pongo2 , liquid ve quicktemplate .

Başlayalım!

template/text

Go'nun standart kitaplığı , tam özellikli ve güçlü bir şablon oluşturma motoru sağlar. Çok performanslı ve iyi optimize edilmiş.

Verim

Performans, herhangi bir bilgisayar programının en önemli yönüdür. Go'nun standardı üretimde yaygın olarak kullanılmaktadır ve anlaşılır bir şekilde geliştiriciler için popüler bir seçenektir.

Ayrıştırma

Kullanım durumunuz şablonların sık sık değişmesini gerektiriyorsa veya her istekte şablonları yüklemeniz gerekiyorsa, hızlı ayrıştırma çok önemli bir kıyaslama haline gelir. text paketi, çeşitli ayrıştırma yöntemleri sağlar; dizeden, dosyadan ayrıştırma veya bir dosya sisteminden dosyaları okumak için kalıp kullanma gibi.

 // template has loop, if statement function call etc. BenchmarkGoParsing-10 32030 37202 ns/op

Şablonu başlangıçta ayrıştırabilir ve performansı artırmak için önbelleğe alabilirsiniz. Şablonunuz sık sık değişiyorsa, arka planda sabit bir zaman aralığında güncellenen bir cron kullanabilirsiniz.

dize değiştirme

Bir dize ikamesi, herhangi bir şablonlama motorunun en temel işlevidir ve text , dize ikamesinde süper hızlıdır.

 // template -> This is a simple string {{ .Name }} with value as string BenchmarkGoStd-10 4185343 288.8 ns/op

Veri bağlamı olarak yapı kullanılırken dize ikamesi daha hızlıdır – anahtar arama için geçen süreyi de artırdığından haritayı kullanmak biraz yavaş olabilir.

 // template -> This is a simple string {{ index . "name" }} with value as string BenchmarkGoStdMapWithIndex-10 1333495 852.7 ns/op

Gördüğünüz gibi harita kullanmak maliyetli. index işlevinden kaçınmak, yukarıdaki şablonu optimize etmeye izin verir.

 // template -> This is a simple string {{ .Name }} with value as string` BenchmarkGoStdMapWith-10 3563234 338.5 ns/op

. ayrıca harita üzerinde anahtar arama yapmamızı sağlar.

Şartlılar

Koşullar, şablon motorları için hayati bir işlemdir; verimsiz koşullu işlemler kötü performansa neden olur. text paketi, and ve or işlemleri desteğiyle if işlemleri için destek sağlar. Bunların her ikisi de, her argümanın bir boole tipi olduğu birden fazla argüman alır. text , koşullar için makul performans sağlar.

 // template -> This is the file {{if and .First (eq .Second "value") (ne .Third "value")}}Got{{end}}. Git do BenchmarkGoIfString-10 506409 2323 ns/op

Yukarıda gösterilen performans, eq ve ne çağrılarından kaçınılarak geliştirilebilir. template her işlev yansıma yoluyla çağrılır ve burada bir performans isabetine neden olur.

Eğer eq .Second "``value``" olsaydı, beton tipi derleyici tipinde bilineceğinden derleyici onu optimize edebilirdi. Tüm eq ve ne çağrıları basit bir boole ile değiştirilirse, hızlar daha hızlı olacaktır.

 // template -> This is the file {{if and .First .Four .Five}}Got{{end}}. Git do BenchmarkGoIf-10 987169 1186 ns/op

(Not: Kıyaslama sırasında, zaman hesaplamalarına dizi karşılaştırmaları da dahil edilmiştir)

döngüler

Döngüler ayrıca text paketi tarafından sağlanır. range , dilimler, diziler ve haritalar üzerinde yineleme yapmak için kullanılır. Döngüler için performans, döngü gövdesinde yer alan işlemlere bağlıdır.

 // template ->`{{range .Six}}{{.}},{{end}}` BenchmarkGoLoop-10 1283661 919.8 ns/op

Benzer şekilde, harita üzerinde yineleme yapmak da başarılıdır:

 // template -> {{range $key, $value:=.Seven}}{{$key}},{{$value}}:{{end}} BenchmarkGoLoopMap-10 566796 2003 ns/op

İşlev çağrıları

Bunun yerine işlev çağrıları, geliştiricinin bir şablon içindeki girdileri değiştirmesine ve dönüştürmesine izin verir. Ancak, işlev çağrıları yansıma yoluyla gerçekleştiğinden, bu genellikle bir maliyete neden olur. İşlevleri kullanmanın yüksek bir maliyeti vardır – mümkünse işlev çağrılarından kaçının.

 // template -> This is a simple string {{ noop }} with value as string BenchmarkGoStdCallFunc-10 2611596 472.3 ns/op

İç içe şablonlar

İç içe şablonlar, kullanıcıların kodu paylaşmasına ve gereksiz yere kod tekrarından kaçınmasına olanak tanır. text , iç içe şablonları çağırmak için destek sağlar.

 // template -> {{define "noop"}} This is {{.Second}} and {{.Third}} {{end}} // //{{template "noop" .}} BenchmarkGoNested-10 1868461 630.2 ns/op

Topluluk desteği

Özellikle text , bir şablon içinde kullanılabilecek çok çeşitli işlevler sağlayan sprig gibi kitaplıklarla mükemmel topluluk desteğine sahip olduğunu belirtmekte fayda var. Sözdizimi vurgulama ve doğrulama yerleşik desteği, Go'nun standart kitaplık şablonlama paketiyle standart olarak gelir.

pongo2

pongo2 , Django sözdiziminden ilham alan sözdizimine sahip, topluluk tarafından oluşturulmuş bir şablon motorudur. Go için topluluk tarafından inşa edilmiştir. GitHub'da 2K'dan fazla yıldızla bugün çok popüler.

Verim

pongo2 , şablonlar içindeki işlev çağrıları için iyi bir şekilde optimize edilmiştir. Döngüler, koşullar ve iç içe şablonlar içeren tam bir şablon motorudur.

Ayrıştırma

pongo2 , dize, bayt, dosya ve önbellekten şablonların ayrıştırılmasını destekler. Performans açısından, Go'nun standart kitaplığının şablon paketinden biraz daha hızlı olduğunu görebiliriz:

 // template has loop, if, nested template and function call BenchmarkPongoParsing-10 38670 29153 ns/op

dize değiştirme

text paketi ile karşılaştırıldığında pongo2 dize ikamesi biraz daha yavaştır. Yalnızca veri bağlamı için haritayı destekler, bu da aşağıdaki kıyaslamada yansıtılan ekstra arama işlemi süresi sağlar.

 // template -> This is a simple string {{ name }} with value as string BenchmarkPongo2-10 1815843 654.2 ns/op

Şartlılar

pongo2 , if/else için geliştirici dostu daha fazla sözdizimine sahiptir. Programlama dillerinde if/else nasıl yazıldığına daha yakındır. if/else , performans açısından pongo2'de text paketinden daha maliyetlidir.

 // template -> Name is {% if First && Four && Five %}got{% endif %}. Go BenchmarkPongo2String2If-10 709471 1528 ns/op

döngüler

pongo2 döngüler, text paketinden biraz daha yavaştır:

 // template -> {% for value in Six %} {{ value }}, {% endfor %} BenchmarkPongo2String2Loop-10 650672 1796 ns/op

Haritadaki döngüler de daha yavaştır:

 // template -> {% for key,value in Seven %} {{key}},{{ value }}, {% endfor %} BenchmarkPongo2String2LoopMap-10 359858 3182 ns/op

İşlev çağrıları

pongo2 işlev çağrıları text paketinden daha hızlıdır, çünkü derleme zamanında bilinen bir işlev imzasına sahiptir ve işlevin bir yansıma çağrısından geçmesi gerekmediğinden daha hızlı hale getirir.

 // template -> This is a simple string {{ noop }} with value as string BenchmarkPongo2StdCallFunc-10 4775058 261.9 ns/op

İç içe şablonlar

pongo2 makroları, text paketinden daha yavaş olan iç içe şablon performansı için sağlanır.

 // template -> {% macro noop(first, second) %} This is {{first}} and {{second}} {% endmacro %} {{noop("anshul","goyal")}} BenchmarkPongo2String2Nested-10 657597 1665 ns/op

liquid

liquid , Shopify'ın şablon dilinin topluluk tarafından oluşturulmuş bir uygulamasıdır. Tam özellikli bir şablonlama kitaplığı sağlar.

Verim

liquid , araştırmamdan oldukça başarılı. Döngüler, koşullar ve iç içe şablonlar içeren tam bir şablon motorudur.

Ayrıştırma

liquid , dize, bayt ve dosyalardan şablonların ayrıştırılmasını destekler. Performans açısından, Go'nun standart kitaplık şablon paketinden ve pongo2 biraz daha yavaştır.

 // template has loop, if, nested template and function call BenchmarkLiquidParsing-10 29710 40114 ns/op

dize değiştirme

Dize değiştirme performansı pongo2 ile karşılaştırılabilirken, liquid text paketinden biraz daha yavaştır. Yalnızca veri bağlamı için haritayı destekler, bu da aşağıdaki kıyaslamada gösterilen ekstra arama işlemi süresi sağlar.

 // template -> This is a simple string {{ name }} with value as string BenchmarkLiquidString-10 1815843 676.0 ns/op

Şartlılar

liquid , if/else için geliştirici dostu sözdizimine sahiptir. Diğer yerleşik programlama dillerinde nasıl yazıldığına daha yakındır. if/else , text paketinden daha az sıvı, ancak pongo2 daha hızlıdır.

 // template -> This is the file {%if First and Four and Five %}Got{%endif%}. Git do BenchmarkLiquidIf-10 709471 953.3 ns/op

döngüler

liquid döngüler de text paketini kullanırken olduğundan daha yavaştır. Döngüler, pongo2 ile karşılaştırıldığında bile liquid daha yavaştır:

 // template -> {%for value in Six %}{{value}},{%endfor%} BenchmarkLiquidLoop-10 650672 3067 ns/op

İşlev çağrıları

pongo2 işlev çağrıları, liquid daha hızlıdır, çünkü derleme zamanında çekilen bir işlev imzasına sahiptir ve işlevin bir yansıma çağrısından geçmesine gerek yoktur, bu da onu daha hızlı hale getirir.

 // template -> This is a simple string {{ noop }} with value as string BenchmarkPongo2StdCallFunc-10 4775058 359.0 ns/op

quicktemplate

quicktemplate şablon, önceden derlenmiş bir şablondur; şablonları Go koduna dönüştürür. Geliştiricilerin çalışma zamanında kodu değiştirmesine izin vermez. quicktemplate , herhangi bir yansıma yapmadığından ve her şey bir derleyici optimize edici aracılığıyla çalıştırıldığından çok hızlıdır.

Kullanım durumunuzun sık güncellemelere ihtiyacı yoksa quicktemplate sizin için çok iyi bir seçim olabilir. liquid ve fasttemplate quicktemplate dizi ikameleri için) aşağıda gösterilmiştir:

Özellik sıvı hızlı şablon hızlı şablon
Ayrıştırma 40114 ns/çalışma 188.8 ns/oper Yok
If ifadeleri 953.3 ns/işletim Yok 87.47 ns/oper
dizelerle if ifadeleri 1144 ns/işletim Yok 99.18 yok/işlem
döngüler 3067 ns/oper Yok 268.8 ns/oper
fonksiyonlar 359,0 ns/işletim Yok 191.7 ns/işletim
iç içe şablonlar Yok Yok 191.7 ns/işletim
Dize Değiştirme 676.0 ns/işletim 75.21 ns/op 105.9 ns/oper

quicktemplate şablon önceden derlenmiş şablon motorudur (yani bir şablon Go koduna dönüştürülür). Go kodu daha sonra derleyici tarafından optimize edilerek çok hızlı yürütme sağlanır. Ayrıca yansımayı önleyerek büyük performans kazanımları sağlar.

(Not: hızlı şablon hızlı şablon yürütme sağlar, ancak şablonun çalışma zamanı güncellemesi olmaması fasttemplate quicktemplate dize değiştirmeyi destekler)

Çözüm

pongo2 ve text her ikisinin de kendi artıları ve eksileri vardır. pongo2 text text olarak daha iyi performans sağlar.

Hangi şablonlama kitaplığını kullandığınız, belirli bir proje için hangisinin ihtiyaçlarınıza daha uygun olduğuna bağlıdır. text , Go'nun kurulumuyla birlikte önceden paketlenmiş olarak gelir, bu da onu doğal olarak çok popüler bir seçim haline getirirken, şablonlarınızın sık sık değiştirilmesi gerekmiyorsa hızlı şablon gibi seçenekler de iyi bir seçim olabilir ve pongo2 quicktemplate diğerlerinin kullanımı daha kolaydır. Go'nun standart kitaplığını kullanmaktan pek keyif almıyorsunuz. Yalnızca dize değişikliğine ihtiyacınız varsa, fasttemplate performans açısından da harika bir seçimdir.

Go şablon kitaplıkları sonrası: İlk olarak LogRocket Blog'da bir performans karşılaştırması göründü.

etiketlerETİKETLER
Üzgünüm, bu içerik için hiç etiket bulunmuyor.

Sıradaki içerik:

Go şablon kitaplıkları: Bir performans karşılaştırması