ลองทดสอบวัดประสิทธิภาพแบบคร่าว ๆ เพื่อหาวิธีการเขียนโค๊ด
เริ่มต้นด้วยการสร้างคลาสเพื่อจับเวลาก่อน
class TimeIt:
import time
def __init__(self):
self.p_start=time.time()
def use(self):
t_now=time.time()
t_use=t_now-self.p_start
self.p_start=t_now
return t_use
ตามด้วยการสั่งจากเชลล์ของไพธอน
import adodb
conn = adodb.NewADOConnection("postgres")
cur = conn.Connect(host, user, password, db)
sql = """CREATE TABLE test (wordid SERIAL, word VARCHAR(255), PRIMARY KEY (wordid))"""
cur = conn.Execute(sql)แบบที่ ๑
def f1():
ttt = TimeIt()
for i in range(1000):
sql = """INSERT INTO test (word) VALUES ('abc%s')""" % (i,)
cur = conn.Execute(sql)
sql = """SELECT wordid FROM test WHERE word=%s""" % (conn.qstr(i),)
cur = conn.Execute(sql)
print ttt.use()
sql = """DELETE FROM test"""
cur = conn.Execute(sql)
ได้ผลเป็น
>>> f1() 9.27473306656 >>> f1() 9.16922688484 >>> f1() 9.21483206749 >>> f1() 9.20028710365 >>> f1() 10.2529239655 >>> f1() 9.16449689865
แบบที่ ๒
def f2():
ttt = TimeIt()
for i in range(1000):
sql = """INSERT INTO test (word) VALUES ('abc%s'); \
SELECT wordid FROM test WHERE word=%s""" % (i, conn.qstr(i),)
cur = conn.Execute(sql)
print ttt.use()
sql = """DELETE FROM test"""
cur = conn.Execute(sql)
ได้ผลเป็น
>>> f2() 9.11072301865 >>> f2() 9.20462703705 >>> f2() 9.24071407318 >>> f2() 9.25392103195 >>> f2() 9.02831697464 >>> f2() 9.07160282135 >>>
def f3():
def get_id(word):
sql = """SELECT wordid FROM test WHERE word=%s""" % (conn.qstr(word),)
cur = conn.Execute(sql)
return cur.fields[0]
def add_word(word):
sql = """INSERT INTO test (word) VALUES (%s)""" % (conn.qstr(word),)
cur = conn.Execute(sql)
return get_id(word)
ttt = TimeIt()
for i in range(1000):
add_word("abc%s" % (i,))
print ttt.use()
sql = """DELETE FROM test"""
cur = conn.Execute(sql)
ได้ผลเป็น
>>> f3() 9.02051997185 >>> f3() 9.06975603104 >>> f3() 9.30845808983 >>> f3() 9.06503009796 >>> f3() 9.89376401901 >>> f3() 9.28391385078 >>>
def f4():
def add_word(word):
sql = """INSERT INTO test (word) VALUES (%s)""" % (conn.qstr(word),)
cur = conn.Execute(sql)
return cur
ttt = TimeIt()
for i in range(1000):
add_word("abc%s" % (i,))
print ttt.use()
sql = """DELETE FROM test"""
cur = conn.Execute(sql)
ได้ผลเป็น
>>> f4() 8.93194293976 >>> f4() 8.94240808487 >>> f4() 9.14316105843 >>> f4() 8.93977403641 >>> f4() 9.05243611336 >>> f4() 9.06761908531 >>>
สรุป
ความเร็วแทบไม่ต่างกันเลย ฉะนั้น เขียนให้อ่านง่าย ปรับปรุงง่าย ดีที่สุด
ค้างทดสอบ (รอ postgres-8.2)
def fx():
ttt = TimeIt()
for i in range(1000):
sql = """INSERT INTO test (word) VALUES ('abc%s') RETURNING \
(SELECT wordid FROM test WHERE word=%s)""" % (i, conn.qstr(i),)
cur = conn.Execute(sql)
print ttt.use()
sql = """DELETE FROM test"""
cur = conn.Execute(sql)
RETURNING มีใช้ใน Oracle กับ Postgres-8.2.3