That does sound rather strange.

Can you also reproduce if you remove `-sMAIN_MODULE=1` and
`-sALLOW_MEMORY_GROWTH`?

Is the IDBFS storage growing on each iteration?   Can you tell where the
slowdown is happening exactly?   I can't see how it would be related to
ASYNCIFY.   Can you also try wth `-sJSPI` instead of `-sASYNCIFY`?

cheers,
sam

On Tue, Feb 10, 2026 at 8:05 AM 'leopatras' via emscripten-discuss <
[email protected]> wrote:

> Hi folks, we ran into an issue that so far all of our SQL tests with
> sqlite are running slower and slower over time in our ASYNCIFY'd
> environment on a IDBFS mount...only in Chrome.
> FF and Safari are performing with roughly the same times each loop.
> Even deleting the DB file in the IDBFS doesn't help, I can revert to the
> initial loop time only when deleting the indexed DB content.
> Running on MEMFS I can't observe this behaviour. Also running without
> ASYNCIFY I can't observe this behavior..(unfortunately we need both IDBFS
> and ASYNCIFY)
> Is this a known issue ?
> Thanks in advance,
> Leo
>
> Env : latest sqlite amalgation 3.51.2, latest emscripten 5.0.0,latest
> Chrome 144.0.7559.133.
>
> emcc flags:
>
> emcc \
>
>           -s MAIN_MODULE=1 \
>
>           -O2 \
>
>           -s EXPORT_ALL=1 \
>
>           -s EXIT_RUNTIME=1 \
>
>           -s ASSERTIONS=1 \
>
>           -s FORCE_FILESYSTEM=1 \
>
>           -s ALLOW_MEMORY_GROWTH=1 \
>
>           -s ASYNCIFY \
>
>           -lidbfs.js \
>
>           -o main.html $(OBJS)
> little sqlite demo creating a table, insert 100 rows, delete, drop and
> remove in each loop.
> (complete code at https://github.com/leopatras/em_slow_sqlite_chrome)
>
> #include <stdio.h>
>
> #include <stdlib.h>
>
> #include <sys/time.h>
>
> #include <emscripten.h>
>
> #include "sqlite3.h"
>
>
> EM_JS(char*,addPersistentDirsInt,(),{
>
>   const dirname="/persist";
>
>   try {
>
>     FS.mkdir(dirname);
>
>   } catch(err) {
>
>     console.error("mkdir %o failed:%o",dirname,err);
>
>     return;
>
>   }
>
>   try {
>
>     FS.mount(IDBFS, { autoPersist: true }, dirname);
>
>     console.log("did mount IDBFS to "+dirname);
>
>   } catch (err) {
>
>     console.error("mount(IDBFS,{ autoPersist: true },%o)
> error:%o",dirname,err);
>
>   }
>
> });
>
>
>
> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
>
> {
>
>     NotUsed = 0;
>
>     /*
>
>        int i;
>
>        for (i = 0; i < argc; i++) {
>
>        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
>
>        }
>
>        printf("\n");
>
>      */
>
>     return 0;
>
> }
>
>
> int main(int argc, char **argv)
>
> {
>
>     sqlite3 *db;
>
>     char *err = 0;
>
>     int rc,i,loop;
>
>     struct timeval stop, start;
>
>     addPersistentDirsInt();
>
>     for (loop = 1; loop <= 20; loop++) {
>
>         gettimeofday(&start, NULL);
>
>         remove("/persist/test.db");
>
>         rc = sqlite3_open("/persist/test.db", &db);
>
>         if (rc == SQLITE_OK) {
>
>             rc = sqlite3_exec(db,
>
>                               "CREATE TABLE test (id INTEGER NOT NULL,
> text VARCHAR(100))",
>
>                               callback, 0, &err);
>
>             if (rc != SQLITE_OK) {
>
>                 fprintf(stderr, "SQL error CREATE: %s\n", err);
>
>             }
>
>             for (i = 1; i < 100; i++) {
>
>                 char buf[500];
>
>                 sprintf(buf, "INSERT INTO test VALUES (%d, 'text%d')", i,
>
>                         i);
>
>                 rc = sqlite3_exec(db, buf, callback, 0, &err);
>
>                 if (rc != SQLITE_OK) {
>
>                     fprintf(stderr, "SQL error INSERT: %s\n", err);
>
>                 }
>
>             }
>
>             rc = sqlite3_exec(db, "SELECT * FROM test", callback, 0, &err);
>
>             if (rc != SQLITE_OK) {
>
>                 fprintf(stderr, "SQL error SELECT: %s\n", err);
>
>             }
>
>             rc = sqlite3_exec(db, "DELETE FROM  test", callback, 0, &err);
>
>             if (rc != SQLITE_OK) {
>
>                 fprintf(stderr, "SQL error DELETE: %s\n", err);
>
>             }
>
>             rc = sqlite3_exec(db, "DROP TABLE test", callback, 0, &err);
>
>             if (rc != SQLITE_OK) {
>
>                 fprintf(stderr, "SQL error DROP: %s\n", err);
>
>             }
>
>             sqlite3_close(db);
>
>             gettimeofday(&stop, NULL);
>
>             printf("loop:%d db ops took %lld msec\n",loop,
>
>                    (stop.tv_sec - start.tv_sec) * 1000000 + stop.tv_usec -
>
>                    start.tv_usec);
>
>         } else {
>
>             fprintf(stderr, "Can't open database: %s\n",
>
>                     sqlite3_errmsg(db));
>
>             sqlite3_close(db);
>
>             return 1;
>
>         }
>
>     }
>
>     return 0;
>
> }
>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion visit
> https://groups.google.com/d/msgid/emscripten-discuss/fb7330e6-399c-4db6-ad83-bbaeafe13c51n%40googlegroups.com
> <https://groups.google.com/d/msgid/emscripten-discuss/fb7330e6-399c-4db6-ad83-bbaeafe13c51n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/emscripten-discuss/CAL_va2_GN--vB0V_zXMQ62gLtoh3qBzz8xNRMdieCaqDQ%3DY8KQ%40mail.gmail.com.

Reply via email to