3 points par xguru 2023-12-16 | Aucun commentaire pour le moment. | Partager sur WhatsApp

Bibliothèques utilisées

  • craw : solution basée sur CGO. Ce n’est pas un pilote database/sql
  • mattn : solution basée sur CGO. C’est toujours le standard de facto et elle est largement utilisée
  • modernc : solution pure Go. Nouvelle bibliothèque basée sur une réécriture en Go du code C de SQLite
  • ncruces : solution pure Go basée sur WASM
  • sqinn : solution sans CGO. Utilise github.com/cvilsmeier/sqinn pour accéder au fichier de base de données SQLite
  • zombie : réécriture du pilote crawshaw à l’aide de la bibliothèque modernc. Ce n’est pas un pilote database/sql

Benchmark

  • Création d’une base de test composée de user/article/comment
  • Création et lecture de 1 million d’utilisateurs
    • 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
  • Requête complexe : dans une transaction, création de 200 utilisateurs ; dans une autre transaction, création de 100 articles par utilisateur ; dans une autre transaction, création de 20 commentaires par article. Requête sur l’ensemble avec des JOIN
    • 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
      Here are the remaining sections of the "go-sqlite-bench" GitHub repository summary in the requested format:
  • Nombreuses lectures (Many) : insertion de N utilisateurs dans une seule transaction de base de données, puis 1000 lectures
    • 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
  • Données volumineuses (Large) : insertion de 10 000 utilisateurs avec un contenu de ligne de N octets, puis lecture de tous les utilisateurs
    • 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
  • Concurrence (Concurrent) : après insertion de 1 million d’utilisateurs, lecture de tous les utilisateurs avec N goroutines
    • 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

Résumé

  • Impossible de désigner un vainqueur absolu, tout dépend du cas d’usage
  • Crawshaw et Zombiezen sont plutôt rapides
  • Mattn reste le standard de facto, mais ce n’est pas la meilleure solution dans l’ensemble
  • SQLite sans CGO est également possible

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.