Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Simple benchmark suite so we can make tortoise go faster

NotificationsYou must be signed in to change notification settings

tortoise/orm-benchmarks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

71 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Qualification criteria is:

  • Needs to support minimum 2 databases, e.g. sqlite + something-else
  • Runs on Python3.7
  • Actively developed
  • Has ability to generate initial DDL off specified models
  • Handle one-to-many relationships

Benchmarks:

These benchmarks are not meant to be used as a direct comparison.They suffer from co-operative back-off, and is a lot simpler than common real-world scenarios.

Tests:

  1. Insert: Single (single entry at a time)
  2. Insert: Batch (many batched in a transaction)
  3. Insert: Bulk (using bulk insert operations)
  4. Filter: Large (a large result set)
  5. Filter: Small (a limit 20 with random offset)
  6. Get
  7. Filter: dict
  8. Filter: tuple
  9. Update: Whole (update the whole object)
  10. Update: Partial (update only a single field of the whole object)
  11. Delete

1) Small table, no relations

model Journal:    id: autonumber primary key    timestamp: datetime → now()    level: small int(enum) → 10/20/30/40/50 (indexed)    text: varchar(255) → A selection of text (indexed)

2) Small table, with relations

model Journal:    id: autonumber primary key    timestamp: datetime → now()    level: small int(enum) → 10/20/30/40/50 (indexed)    text: varchar(255) → A selection of text (indexed)    parent: FK to parent BigTree    child: reverse-FB to parent BigTree    knows: M2M to BigTree

3) Large table

model BigTree:    id: uuid primary key    created_at: datetime → initial-now()    updated_at: datetime → always-now()    level: small int(enum) → 10/20/30/40/50 (indexed)    text: varchar(255) → A selection of text (indexed)    # Repeated 2 times with defaults, another 2 times as optional:    col_float: double    col_smallint: small integer    col_int: integer    col_bigint: big integer    col_char: char(255)    col_text: text    col_decimal: decimal(12,8)    col_json: json

ORMs:

Django:

https://www.djangoproject.com/

Pros:

  • Provides all the essential features
  • Simple, clean, API
  • Great test framework
  • Excellent documentation
  • Migrations done right™

Cons:

  • Brings whole Django along with it
peewee:
https://github.com/coleifer/peewee
Pony ORM:

https://github.com/ponyorm/pony

Pros:

  • Fast
  • Does cacheing automatically

Cons:

  • Does not support bulk insert.
SQLAlchemy ORM:

http://www.sqlalchemy.org/

Pros:

  • The "de facto" ORM in the python world
  • Supports just about every feature and edge case
  • Documentation re DB quirks is excellent

Cons:

  • Complicated, layers upon layers of leaky abstractions
  • You have to manage transactions manually
  • You have to write a script to get DDL SQL
  • Documentation expects you to be intimate with SQLAlchemy
  • Migrations are add ons
SQLObject:

https://github.com/sqlobject/sqlobject

  • Does not support 16-bit integer forlevel, used 32-bit instead.
  • Does not support bulk insert.
Tortoise ORM:

https://github.com/tortoise/tortoise-orm

  • Currently the onlyasync ORM as part of this suite.
  • Disclaimer: I'm an active contributor to this project

Results (SQLite)

Results for SQLite, using theSHM in-memory filesystem on Linux, to try and make the tests more CPU limited, but still do FS round-trips. Also more consistent than an SSD.

Py39:

Test 1DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single1497.954872.621644.55976.671420.885347.905347.90Tortoise ORM
Insert: Batch4479.476113.6117873.208009.594134.646585.8117873.20Pony ORM
Insert: Bulk16263.3019282.3817151.8122266.3122266.31Tortoise ORM
Filter: Large72808.5137053.46113551.3877921.9430458.5131078.13113551.38Pony ORM
Filter: Small27091.8921447.8614085.4626718.0128338.9318595.5528338.93SQLObject
Get3297.723342.477482.683335.066650.923286.477482.68Pony ORM
Filter: dict98377.0142442.4591354.2972774.8237338.1398377.01Django
Filter: tuple104145.0744562.58111963.06120148.5035421.57120148.50SQLAlchemy ORM
Update: Whole4390.655908.8923083.6816193.3912167.638778.3023083.68Pony ORM
Update: Partial4799.477789.0131692.2029134.5323880.8010027.2731692.20Pony ORM
Delete4923.5110720.9147743.9346426.271602.2410481.3347743.93Pony ORM
Geometric Mean12016.8512731.0125699.5219750.857934.0313016.5830488.23Pony ORM
Test 2DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single1375.244739.111560.53826.581360.565235.685235.68Tortoise ORM
Insert: Batch4214.456076.0613350.852710.254431.666643.6013350.85Pony ORM
Insert: Bulk14587.3618580.249334.3720513.0520513.05Tortoise ORM
Filter: Large70246.5434803.17107677.4068477.3129510.3429973.02107677.40Pony ORM
Filter: Small25822.5618710.8714796.7821498.5926458.4818192.3326458.48SQLObject
Get3061.193254.318124.482930.536272.333238.398124.48Pony ORM
Filter: dict92273.7745158.3182152.6663156.7737411.6292273.77Django
Filter: tuple92140.6543432.18107504.91104278.8534485.92107504.91Pony ORM
Update: Whole4041.055293.0522296.4912227.8211964.758385.3722296.49Pony ORM
Update: Partial4718.187761.1932753.9318142.2423089.398583.9732753.93Pony ORM
Delete949.3510826.3415739.361126.621258.047853.7415739.36Pony ORM
Geometric Mean9708.8312316.122066.8610365.987523.2912234.0926072.4Pony ORM
Test 3DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single1158.992579.051341.74795.491010.963012.693012.69Tortoise ORM
Insert: Batch2565.092814.825110.645135.042652.733816.795135.04SQLAlchemy ORM
Insert: Bulk3899.397228.5711383.037544.9311383.03SQLAlchemy ORM
Filter: Large23726.1212886.4945353.8832007.8116424.6813818.2845353.88Pony ORM
Filter: Small12567.487681.684872.4316312.1715380.6010183.4216312.17SQLAlchemy ORM
Get1780.101121.885418.162838.253760.112064.305418.16Pony ORM
Filter: dict30270.6018113.4123406.9626928.9715463.3730270.60Django
Filter: tuple32982.3018634.5945589.2739613.2514293.4045589.27Pony ORM
Update: Whole2520.121460.3716595.0013253.8210368.594979.7316595.00Pony ORM
Update: Partial4281.077621.5721649.7021192.2722376.788353.9822376.78SQLObject
Delete4725.6910672.4439093.1538714.271436.198972.2439093.15Pony ORM
Geometric Mean5920.375764.7612853.1412079.925509.397032.015685.54Pony ORM

PyPy7.3-Py3.6: (Outdated)

Test 1DjangopeeweePony ORMSQLAlchemy ORMTortoise ORM
Insert: Single4092.946042.456166.891004.986786.58
Insert: Batch4529.936456.8118247.226982.6326348.64
Insert: Bulk17961.1124302.2721428.2280531.38
Filter: Large152801.5291886.54295678.67129700.4090993.88
Filter: Small6099.3665094.77175134.6860966.1945463.05
Get4255.076793.418310.164339.159229.52
Filter: dict147533.08116293.38215108.01109211.5994985.63
Filter: tuple175529.83122951.45281181.48253415.27130914.54
Update: Whole6710.0116514.9141939.1222677.7030434.61
Update: Partial8089.6923377.0451308.1343023.5938576.48
Delete8766.4129169.8874799.4481948.6542805.28
Geometric Mean15887.1227270.6658524.9628825.5139281.41
Test 2DjangopeeweePony ORMSQLAlchemy ORMTortoise ORM
Insert: Single4089.625982.165927.49818.318128.96
Insert: Batch4582.766909.4715558.256012.1925381.23
Insert: Bulk16201.1024021.6720294.0977993.66
Filter: Large138968.3990818.94279382.51118860.2971640.16
Filter: Small5439.6262951.57168192.0352251.1338208.34
Get4092.116989.348230.023379.578430.82
Filter: dict134900.00112626.68202932.9894477.5171689.52
Filter: tuple159685.66122797.29274293.13223882.76119104.10
Update: Whole6201.2611396.2435644.8617562.7028303.72
Update: Partial7669.8823086.1741247.7725492.4035430.58
Delete2087.7634330.6438098.81633.66369.97
Geometric Mean13135.7826719.7250653.7215519.0723445.05
Test 3DjangopeeweePony ORMSQLAlchemy ORMTortoise ORM
Insert: Single2194.073827.504030.12792.545429.88
Insert: Batch2072.863928.597509.874841.2515489.04
Insert: Bulk4747.829996.0115407.3029085.53
Filter: Large25016.7330627.76122459.8637727.962968.21
Filter: Small1508.7424123.1398162.1521523.322454.28
Get2231.564443.866313.332312.701490.23
Filter: dict29467.5240064.7381433.4427085.703001.12
Filter: tuple31329.6546774.06123617.0645894.788845.51
Update: Whole4220.606984.3429109.6010686.2811302.96
Update: Partial7346.7621125.9333835.7414716.4824182.52
Delete9083.2831221.4764601.8564029.4141709.27
Geometric Mean6146.3414064.7432867.6412702.847951.76

Results (PostgreSQL)

PostgreSQL 14.2 on my iMac.

Test 1DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single2697.462350.951438.771528.942391.132127.202697.46Django
Insert: Batch3275.142845.784710.804742.432911.4610351.1910351.19Tortoise ORM
Insert: Bulk10283.9412309.048018.636395.9012309.04peewee
Filter: Large82726.8063288.60131699.6358844.3050097.6960394.02131699.63Pony ORM
Filter: Small21555.9721030.3315793.0520046.5938191.1427055.5538191.14SQLObject
Get2407.952351.784403.822303.465057.523289.335057.52SQLObject
Filter: dict98132.2784224.66102139.4160221.7484444.54102139.41Pony ORM
Filter: tuple106625.8185903.08136295.9788605.1980993.53136295.97Pony ORM
Update: Whole2921.102971.094567.476585.603444.5315486.6015486.60Tortoise ORM
Update: Partial2797.474698.248153.309595.107100.5118292.8818292.88Tortoise ORM
Delete3068.434037.0910634.389627.403026.7320908.4320908.43Tortoise ORM
Geometric Mean10021.1810045.3314237.5911602.36874.2916828.9922424.22Tortoise ORM
Test 2DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single2539.092328.501411.271224.832251.156191.226191.22Tortoise ORM
Insert: Batch3047.012868.064822.544451.612329.8111730.0211730.02Tortoise ORM
Insert: Bulk10221.7813097.385323.1324089.9724089.97Tortoise ORM
Filter: Large76022.3356985.76129987.4255025.5548907.1866584.00129987.42Pony ORM
Filter: Small25138.0523036.8313473.4515691.1335394.6729498.8435394.67SQLObject
Get2369.762428.956715.082186.104299.783345.986715.08Pony ORM
Filter: dict89768.9477124.3394526.9852507.1284390.7494526.98Pony ORM
Filter: tuple93446.9576994.08133410.8676779.3876248.52133410.86Pony ORM
Update: Whole2624.863177.506538.284518.494239.8013470.8313470.83Tortoise ORM
Update: Partial2755.204391.807717.856744.778232.2017027.8217027.82Tortoise ORM
Delete705.786002.876820.62780.781502.4818380.2318380.23Tortoise ORM
Geometric Mean8432.7710302.1214258.867650.526150.2720779.7325428.1Tortoise ORM
Test 3DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single1659.561337.221072.471197.891362.252057.492057.49Tortoise ORM
Insert: Batch1926.091720.192476.653928.801634.215382.425382.42Tortoise ORM
Insert: Bulk4083.484813.745169.098218.978218.97Tortoise ORM
Filter: Large29212.1115313.7746597.1628275.7623833.9125190.8646597.16Pony ORM
Filter: Small11936.527643.786958.6310994.9219048.6514186.2119048.65SQLObject
Get1481.25905.493998.631917.483190.462247.543998.63Pony ORM
Filter: dict30291.0722944.6924043.0224225.8128221.5430291.07Django
Filter: tuple37316.2024910.9448191.8335775.6727661.7448191.83Pony ORM
Update: Whole1660.001141.625982.294790.044137.467815.697815.69Tortoise ORM
Update: Partial2902.674413.856453.727099.408381.5717360.0317360.03Tortoise ORM
Delete3392.166421.2610231.138968.322034.6719775.1219775.12Tortoise ORM
Geometric Mean5444.34644.738313.067434.184673.3610394.9512595.03Tortoise ORM

Results (MySQL)

MySQL 8.0.28 on my iMac.

Test 1DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single1209.921001.091053.191347.271908.046876.586876.58Tortoise ORM
Insert: Batch749.832558.923963.251530.722953.429431.349431.34Tortoise ORM
Insert: Bulk3987.4012345.2710112.3622422.2422422.24Tortoise ORM
Filter: Large49227.9657264.0387150.7558957.6246543.3948015.5787150.75Pony ORM
Filter: Small14872.7616482.544844.0016099.8133623.5627429.8633623.56SQLObject
Get1955.322397.744140.782462.824124.883611.484140.78Pony ORM
Filter: dict56656.0570404.1560058.4851717.0456083.0870404.15peewee
Filter: tuple55412.7871583.7086158.0776517.4552624.1786158.07Pony ORM
Update: Whole2166.471924.824370.826054.753347.9011290.1911290.19Tortoise ORM
Update: Partial2699.934266.037172.5110429.358004.7813482.1713482.17Tortoise ORM
Delete2852.524261.787971.9911119.381466.6915008.6815008.68Tortoise ORM
Geometric Mean5843.528284.899942.1110279.795880.4517482.8620324.93Tortoise ORM
Test 2DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single1635.091211.991503.171193.351833.096608.956608.95Tortoise ORM
Insert: Batch2169.063424.203730.493134.712808.829012.269012.26Tortoise ORM
Insert: Bulk5156.0012022.206509.2619639.9319639.93Tortoise ORM
Filter: Large47022.5850669.9290269.0053166.0442782.4346612.0190269.00Pony ORM
Filter: Small13620.3719250.937432.7115309.1632922.0626025.8332922.06SQLObject
Get1810.181743.565457.962251.675029.053303.885457.96Pony ORM
Filter: dict52659.4064137.9971828.8850016.5449126.4871828.88Pony ORM
Filter: tuple52679.6965446.3590069.3472336.3750094.2090069.34Pony ORM
Update: Whole2347.671706.105001.295288.583714.3010855.7010855.70Tortoise ORM
Update: Partial2446.264068.746731.518148.187689.3413793.1413793.14Tortoise ORM
Delete611.185633.395323.53805.951113.5415653.6115653.61Tortoise ORM
Geometric Mean5700.188359.3810906.277695.765728.6516637.8620627.76Tortoise ORM
Test 3DjangopeeweePony ORMSQLAlchemy ORMSQLObjectTortoise ORMMaxBest ORM
Insert: Single1161.881197.36868.831080.281200.523517.803517.80Tortoise ORM
Insert: Batch1136.711782.502086.512289.901775.704093.844093.84Tortoise ORM
Insert: Bulk2947.014774.885026.136676.916676.91Tortoise ORM
Filter: Large21409.9215339.6142885.4526865.8422947.4117383.9442885.45Pony ORM
Filter: Small7377.327753.805326.2211604.6118188.739937.0418188.73SQLObject
Get912.97897.403436.211932.072808.041647.643436.21Pony ORM
Filter: dict23786.6718481.9120365.5923747.4817939.3523786.67Django
Filter: tuple29319.459438.1242158.6833278.5316991.1042158.68Pony ORM
Update: Whole1572.931061.513674.525221.103289.433302.925221.10SQLAlchemy ORM
Update: Partial2348.493900.115711.357318.677214.524440.857318.67SQLAlchemy ORM
Delete2464.615020.076816.909002.521637.526402.349002.52SQLAlchemy ORM
Geometric Mean3941.193977.646671.877018.644201.456434.929893.7SQLAlchemy ORM

PyPy7.3-Py3.6: (Outdated)

Test 1DjangopeeweePony ORMSQLAlchemy ORMTortoise ORM
Insert: Single2479.552663.103088.68686.923311.91
Insert: Batch3478.124571.765194.874214.0313584.52
Insert: Bulk14553.9019480.4815260.4155214.98
Filter: Large80983.35175029.85479457.8059215.04160185.46
Filter: Small4995.7237628.16136060.2318990.6624888.53
Get2868.254870.546107.972630.396538.67
Filter: dict80650.88219339.95301358.8952242.19183104.50
Filter: tuple93584.59257332.26490594.2974740.17175407.06
Update: Whole3563.437760.365348.805540.2311161.77
Update: Partial4536.0210036.9411210.0712264.9714984.03
Delete4978.7210073.9811107.5210907.2512449.24
Geometric Mean9889.2220926.0930192.6611285.3126393.92
Test 2DjangopeeweePony ORMSQLAlchemy ORMTortoise ORM
Insert: Single2266.322663.822669.34597.253513.88
Insert: Batch3328.184435.966949.973773.8910493.08
Insert: Bulk14065.4218684.7114458.9355861.34
Filter: Large80296.63164763.64447302.9754498.39153077.80
Filter: Small4800.1535434.65130211.6217627.6521258.96
Get2565.444543.195849.482310.206251.27
Filter: dict77842.51207108.12280970.7150958.86185933.49
Filter: tuple91267.58239574.53438762.0473630.97172285.95
Update: Whole2701.755406.826975.434327.979913.26
Update: Partial4539.549879.3610746.9010125.7914495.50
Delete1176.447017.196249.981387.888181.26
Geometric Mean8165.0618884.2728591.568489.4124079.39
Test 3DjangopeeweePony ORMSQLAlchemy ORMTortoise ORM
Insert: Single1008.081582.111617.94465.032258.82
Insert: Batch1492.212833.393595.882126.386739.82
Insert: Bulk3357.716484.936410.3216790.12
Filter: Large12164.8340576.68109275.419531.6234746.82
Filter: Small2314.8112551.2958031.655503.539873.51
Get1083.012165.712800.69854.142358.51
Filter: dict12742.8254209.1573098.848640.3746526.40
Filter: tuple13728.3362009.01107794.6310255.3942013.15
Update: Whole1589.212352.144388.503946.675021.95
Update: Partial3894.788822.506142.397243.8014487.33
Delete3791.238238.258413.578394.1811540.60
Geometric Mean3367.98574.7413385.554134.811175.14

Quick analysis

  • Pony ORM is heavily optimised for performance.
  • Django & SQLAlchemy is surprisingly similar in performance.
  • Tortoise ORM is competitive.
  • Get is surprisingly slow for everyone.
  • Pony ORM, SQLAlchemy & SQLObject does merge operations for updates, so is technically always partial updates.
  • Tortoise ORM performance using theasyncpg PostgreSQL driver is really good, winning overall.
  • Tortoise ORM performance using theaiomysql MySQL driver is mediocre, the driver itself is taking the majority of CPU time. PyPy runs this driver a lot faster, which indicates that the slow paths are likely just in Python itself.

PyPy comparison: SQLite

  • peewee andPony ORM gets a noticeable performance improvement
  • SQLAlchemy ORM andDjango performs similarily
  • Tortoise ORM has slow Reads and fast Create, Update & Delete operation
  • SQLObject fails

PyPy comparison: MySQL

  • peewee andTortoise ORM gets a noticeable performance improvement
  • Pony ORM is marginally faster
  • SQLAlchemy ORM andDjango is marginally slower
  • SQLObject fails

Performance of Tortoise

Versions

Note that these benchmarks have since changed, so state is not exactly the same as above.This should only be used as a "guideline" of the improvement in performance since we started with the performance optimization process.

Tortoise ORM:v0.10.6v0.10.7v0.10.8v0.10.9v0.10.11v0.11.3v0.12.1
Seedup (Insert & Big & Small)19.4, 1.5, 6.125.9, 2.0, 6.681.8, 2.2, 8.795.3, 2.4, 13.1118.2, 2.7, 14.6136.9, 2.4, 13.5
Insert89.892180.382933.197635.428297.539870.5914544.81
Insert: atomic149.592481.163275.5311966.5314791.3618452.5618245.26
Insert: bulk71124.01
Filter: match55866.14101035.06139482.12158997.41165398.56186298.75160746.73
Filter: contains76803.14100536.06128669.50142954.66167127.12177623.78159116.08
Filter: limit 204583.5327830.1429995.2339170.1758740.0565742.8260285.42
Get233.691868.152136.202818.414411.014899.045208.50

Perf issues identified from profiling

  • base.executor._field_to_db() could be replaced with a pre-computed dict lookup
  • Queryset.resolve_filters is doing lots of unnecessary stuff, especially for .get() method
  • Get operation is slow (likely slow SQL generation, could be resolved with parametrized query cacheing)

On Queryset performance

Since pypika is immutable, and our Queryset object is as well, we need tests to guarantee our immutability.Then we can aggresively cache querysets.

Also, we can make more queries use parameterised queries, cache SQL generation, and cache prepared queries.

It seems in cases where we can cache the PyPika result (and use prepared statements), PyPy performance increase is even larger than CPython.

Perf fixes applied

  1. aiosqlitepolling misalignment(sqlite specific)

    (20-40% speedup for retrieval,10× — 15× speedup for insertion):omnilib/aiosqlite#12

  2. pypikaimproved copy implementation(generic)

    (53% speedup for insertion):kayak/pypika#160

  3. tortoise.models.__init__restructure(generic)

    (25-30% speedup for retrieval)tortoise/tortoise-orm#51

  4. tortoise.models.__init__restructure(generic)

    (9-11% speedup for retrieval)tortoise/tortoise-orm#52

  5. aiosqlitemacros(sqlite specific)

    (1-5% speedup for retrieval, 10-40% speedup for insertion)omnilib/aiosqlite#13

  6. Simple prepared insert statements(generic)

    (35-250% speedup for insertion)omnilib/aiosqlite#13tortoise/tortoise-orm#54

  7. pre-generate initial pypika query object per model(generic)

    (25-50% speedup for small fetch operations)tortoise/tortoise-orm#54

  8. pre-generate filter map, and standard select for all values per model(generic)

    (15-30% speedup for small fetch operations)tortoise/tortoise-orm#64

  9. More optimal queryset cloning(generic)

    (6-15% speedup for small fetch operations)tortoise/tortoise-orm#64

  10. pypikaimproved copy implementation(generic)

    (10-15% speedup for small fetch operations)kayak/pypika#205

  11. Optimised inserts/updates & Bulk create(generic)

    (5-40% speedup for small insert operations)
    (350-600% speedup for bulk insert over small insert operations)tortoise/tortoise-orm#142
  12. De-lazied some metadata objects & More efficient queryset manipulation(generic)

    (15-25% speedup for large fetch operations)
    (5-30% speedup for small fetches)tortoise/tortoise-orm#158
  13. Parametrized delete/update(generic)

    (260-280% speedup for delete operations)
    (300-600% speedup for update operations)tortoise/tortoise-orm#177
  14. Lazy Relation properties(generic)

    (15~140% speedup for all on Test 2 (Small & Relational))tortoise/tortoise-orm#187

  15. Know about default converters & native DB types(generic)

    (20-25% speedup for Fetch operations)tortoise/tortoise-orm#190

  16. Connection Pooling(MySQL & PostgreSQL)

    (30-50% speedup overall)tortoise/tortoise-orm#229

  17. Many small tweaks(generic)

    (5-30% depending on driver)tortoise/tortoise-orm#241

About

Simple benchmark suite so we can make tortoise go faster

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp