Here is the test result for selecting 100,000 items in original test case.

shared cache mode
2015-12-20 21:24:58.714 Test[1126:11609] cost 2.173480
2015-12-20 21:24:58.714 Test[1126:11610] cost 2.173449
2015-12-20 21:24:58.714 Test[1126:11608] cost 2.173768
2015-12-20 21:24:58.714 Test[1126:11611] cost 2.173169


without shared cache mode
2015-12-20 21:28:49.647 Test[1286:13077] cost 0.028914
2015-12-20 21:28:49.647 Test[1286:13078] cost 0.028914
2015-12-20 21:28:49.647 Test[1286:13079] cost 0.028964
2015-12-20 21:28:49.647 Test[1286:13076] cost 0.028958


May be your python code does not run the same thing as mine, I am poor in 
python so that I could not figure it out.




????
???:E.Pasmapasma10 at concepts.nl
???:SQLite mailing listsqlite-users at mailinglists.sqlite.org
????:2015?12?18?(??)?18:29
??:Re: [sqlite] {Spam?} SQLite take lower performance while usingshared cache 
on iOS/Mac


17 dec 2015, sanhua.zh:  I try to use shared cache to optimize my code.  
Sincesqlite3_enable_shared_cache is deprecated on iOS/Mac, I  
usesqlite3_open_v2 withSQLITE_OPEN_SHAREDCACHE flag to open shared  cache mode. 
 4 threads select is running in my code, while each thread has its  own sqlite 
connection and do the same thing - select all 100000 item  from ?test? table.  
....  for (int i = 0; i 1000000; i++) {  .."insert into test values(%d);"..  
... Hello, A rude question: is there any chance that the test in shared cache 
mode was taken with 1.000.000 rows instead of 100.000? Because I have quite 
different results: regular mode: 6.2 seconds cache sharing: 6.35 seconds Thanks 
for posting the program source. I had to use a Python program by lack of 
objective C. I'll include the source too, see below. Another thing: I found 
that sqlite3_open takes significant time when connecting to a shared cache that 
is in use. Therefore the Python test measures the overall elapsed time. Python 
offers a thread.join method to know exactly when a thread is finished. Tnanks, 
E.Pasma import random, os, sys, time, threading, subprocess, socket, socket 
import sqlite3 as sqlite TESTDB='larry.db' SHARED=0 SIZE=2000 print('cache 
sharing', SHARED, 'cache size', SIZE) sqlite.enable_shared_cache(SHARED) def 
connect(): con= sqlite.Connection (TESTDB, isolation_level=None, 
check_same_thread=0) con.execute ("pragma cache_size=%i"%(SIZE,)) return con 
def e_str (e): " format exception as string " return "%s: %s" % 
(e.__class__.__name__, e) class Testthread (threading.Thread): """ execute 
query in a thread """ def __init__ (self, qq, con = None): self.con = con 
self.qq = qq self.out = "thr%i.out" % id (self) open (self.out, 'w').close () 
os.remove (self.out) threading.Thread.__init__ ( self, target=self.__target, ) 
def start (self): threading.Thread.start (self) for retry in range (10): 
time.sleep (2 ** retry * .05) if os.access (self.out, os.R_OK): break else: 
print("Testthread: spoolfile does not appear") time.sleep (.10) # for the SQL 
to start def __target (self): if not self.con: self.con = connect () f = open 
(self.out, 'w') try: try: for q in self.qq.split (';'): for i in 
self.con.execute(q).fetchall(): f.write (str(i)+'\n') except Exception as e: 
f.write (e_str (e) + '\n') finally: f.close() self.con.close () def join (self, 
timeout=None): if timeout is not None: threading.Thread.join (self, timeout) 
else: timeout = 7.5 # respond to keyboard interrupts while self.isAlive (): 
threading.Thread.join (self, timeout) return self def get_result (self): try: 
return open (self.out, 'r').read ().strip () except IOError as e: return None 
def main (): # create some test data ###try: os.remove (TESTDB) ###except 
OSError: pass t0=time.time() con = connect () cur = con.cursor () cur.execute 
("begin") try: cur.execute ("create table test (id integer)") except 
sqlite.OperationalError: pass else: for i in range (1000000): cur.execute 
("insert into test(id) values(:1)",(i,)) cur.execute ("end") cur.close () 
con.close () print("na insert", time.time()-t0) qq="SELECT COUNT(*) FROM test 
WHERE +id-1" qq+=';'+qq tthh=[] for i in range(4): con = None ###connect() 
tthh.append (Testthread (qq, con)) print("na splits", time.time()-t0) for th in 
tthh: th.start () print("na start", time.time()-t0) for th in tthh: res=th.join 
().get_result().split('\n') assert res[0]=='(1000000,)', res[0] 
print(time.time()-t0, 'seconds') if __name__ == "__main__": main () 
_______________________________________________ sqlite-users mailing list 
sqlite-users at mailinglists.sqlite.org 
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to