adodb: บันทึกทดสอบ Benchmark

ลองทดสอบวัดประสิทธิภาพแบบคร่าว ๆ เพื่อหาวิธีการเขียนโค๊ด

เริ่มต้นด้วยการสร้างคลาสเพื่อจับเวลาก่อน

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