2011/6/1 Dominique Pellé <dominique.pe...@gmail.com>:
> Alessandro Marzocchi wrote:
>
>> Hello,
>>    I made some preliminary tests for an application storing big
>> chunks of data in a sqlite database. I did firsts tests with python
>> and they gave me quite impressive results. I then tried to make the
>> same test using C. I expected to get execution times to be the same of
>> those of python. However I was surprised as the performance got a lot
>> worse, with execution times being more than 3 times more.
>
> ...snip...
>
>>  if(SQLITE_OK!=(ret=sqlite3_prepare_v2(db,
>>    "INSERT INTO helloworld VALUES (?,?,?)",
>>    -1,
>>    &db_stm,
>>    NULL
>>  )))
>
> Since you're going to always insert 1 in the first
> column, why not use:
>
> INSERT INTO helloworld VALUES (1,?,?)
>
>
>>  {
>>    fprintf(stderr,"sqlite error in prepare() [%d]",ret);
>>    return -1;
>>  };
>>
>>  int i;
>>  char data[1024*8+1];
>>  for(i=0;i<1024*8;i++)data[i]='0';
>>  data[1024*8]='\0';
>
> Since the data column also does not change,
> you could bind it only once before entering
> the for loop (rather than binding it at each loop
> iteration)
>
>
>>  for(i=0;i<100000;i++)
>>  {
>>    if(!(i%10000))printf("%d\n",i);
>>
>>    if(SQLITE_OK!=(ret=sqlite3_bind_int(db_stm, 1, 1)))
>>    {
>>      fprintf(stderr,"sqlite error in bind()");
>>      return -1;
>>    }
>
> Above bind is useless if you used:
> INSERT INTO helloworld VALUES (1,?,?)
>
>
>>    if(SQLITE_OK!=(ret=sqlite3_bind_int(db_stm, 2, i)))
>>    {
>>      fprintf(stderr,"sqlite error in bind()");
>>      return -1;
>>    }
>>    //if(SQLITE_OK!=(ret=sqlite3_bind_blob(db_stm, 3, data,-1,
>> SQLITE_STATIC/*SQLITE_TRANSIENT*/)))
>>    if(SQLITE_OK!=(ret=sqlite3_bind_blob(db_stm, 3, data,8192,
>> SQLITE_STATIC/*SQLITE_TRANSIENT*/)))
>>    {
>>      fprintf(stderr,"sqlite error in bind_blob() [%d] ok=%d",ret,SQLITE_OK);
>>      return -1;
>>    }
>
> above bind to blob can be moved outside the loop.
>
>
>>    ret=sqlite3_step(db_stm);
>>    if(ret!=SQLITE_DONE)
>>    {
>>      fprintf(stderr,"sqlite error in sqlite3_step() [%d]",ret);
>>      return -1;
>>    }
>>    if(SQLITE_OK!=(ret=sqlite3_reset(db_stm)))
>>    {
>>      fprintf(stderr,"sqlite error in sqlite3_reset() [%d]",ret);
>>      return -1;
>>    }
>>    sqlite3_clear_bindings(db_stm);
>
> Calling sqlite3_clear_binding(...) at each iteration
> is not needed in your example.  In fact, you should
> not call it at all if you decide to move the bind to the blob
> outside the loop.
>
> That should make it faster.
I used this structure as it is more representative of what the queries
the real application will do...
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to