3 puan yazan xguru 2023-12-16 | Henüz yorum yok. | WhatsApp'ta paylaş

Kullanılan kütüphaneler

  • craw: CGO tabanlı çözüm. database/sql sürücüsü değil
  • mattn: CGO tabanlı çözüm. Hâlâ fiili standart ve yaygın olarak kullanılıyor
  • modernc: Saf Go çözümü. SQLite C kodunun Go ile yeniden yazılmasına dayanan yeni bir kütüphane
  • ncruces: WASM tabanlı saf Go çözümü
  • sqinn: CGO kullanmayan çözüm. SQLite DB dosyasına erişmek için github.com/cvilsmeier/sqinn kullanıyor
  • zombie: crawshaw sürücüsünün modernc kütüphanesi kullanılarak yeniden yazılmış hâli. database/sql sürücüsü değil

Benchmark

  • user/article/comment yapısından oluşan test veritabanı oluşturuldu
  • 1 milyon kullanıcı oluşturma ve sorgulama
    • insert : sqinn 883ms > craw 1234ms > mattn 1537ms > zombie 1862ms > modernc 5557ms > ncruces 10073ms
    • query : zombie 325ms > craw 608ms > sqinn 641ms > mattn 1267ms > modernc 1379ms > ncruces 6080ms
  • Karmaşık sorgu: Bir transaction içinde 200 kullanıcı oluşturma, başka bir transaction ile kullanıcı başına 100 makale oluşturma, bir başka transaction ile makale başına 20 yorum oluşturma. Hepsini JOIN ederek sorgulama
    • insert : sqinn 574 > craw 729ms > mattn 911ms > zombie 1400ms > modernc 3211ms > ncruces 5159ms
    • query : zombie 507ms > craw 667ms > sqinn 709ms > mattn 1387ms > modernc 1633ms > ncruces 5380ms
      İstenen formatta go-sqlite-bench GitHub deposu özetinin kalan bölümleri şöyle:
  • Çok sayıda okuma (Many): N kullanıcıyı tek bir veritabanı transaction'ına ekledikten sonra 1000 kez sorgulama
    • query/N=10 : zombie 17ms > craw 14ms > sqinn 25ms > mattn 30ms > modernc 35ms > ncruces 185ms
    • query/N=100 : zombie 36ms > craw 65ms > sqinn 83ms > mattn 130ms > modernc 135ms > ncruces 829ms
    • query/N=1000 : zombie 225ms > craw 520ms > sqinn 619ms > mattn 1143ms > modernc 1180ms > ncruces 7230ms
  • Büyük veri (Large): 10.000 kullanıcı ve N baytlık satır içeriği ekledikten sonra tüm kullanıcıları sorgulama
    • query/N=50000 : mattn 168ms > craw 197ms > ncruces 244ms > modernc 276ms > zombie 552ms > sqinn 519ms
    • query/N=100000 : mattn 290ms > craw 346ms > ncruces 391ms > modernc 514ms > zombie 1071ms > sqinn 1085ms
    • query/N=200000 : mattn 591ms > craw 624ms > ncruces 789ms > modernc 888ms > zombie 2198ms > sqinn 2264ms
  • Eşzamanlılık (Concurrent): 1 milyon kullanıcı ekledikten sonra tüm kullanıcıları N goroutine ile sorgulama
    • query/N=2 : zombie 367ms > craw 692ms > sqinn 854ms > mattn 1516ms > modernc 2889ms > ncruces 8268ms
    • query/N=4 : zombie 646ms > craw 1100ms > sqinn 1411ms > mattn 1840ms > modernc 7144ms > ncruces 12710ms
    • query/N=8 : zombie 1140ms > craw 1873ms > sqinn 2460ms > mattn 3483ms > modernc 18674ms > ncruces 25792ms

Özet

  • Net bir üstünlük yok; her şey kullanım senaryosuna bağlı
  • Crawshaw ve Zombiezen oldukça hızlı
  • Mattn fiili standart olsa da genel olarak en iyi çözüm değil
  • CGO olmadan da SQLite mümkün

Henüz yorum yok.

Henüz yorum yok.