Java、PHP、Python與MySQL交互的性能測試-創(chuàng)新互聯(lián)

這幾天看源碼弄清了一件事:WEB服務(wù)器接收瀏覽器請求、將請求傳給PHP/Python進程(FCGI等)、與數(shù)據(jù)庫進行交互都是用socket(套接字)。
也就是說,這些行為都是進程間通信。一臺WEB服務(wù)器在硬件、操作系統(tǒng)不變的情況下,它的性能主要取決于socket通信的速度。如果所有進程都在一臺服務(wù)器上的話,這個速度就取決于通信的效率了。

例如與MySQL數(shù)據(jù)庫交互時,程序會調(diào)用驅(qū)動程序來訪問數(shù)據(jù)庫,這個驅(qū)動程序主要做這幾件事:

1.創(chuàng)建socket,連接到MySQL。

2.將程序調(diào)用的API翻譯成SQL語句,通過socket發(fā)送給MySQL;MySQL執(zhí)行后,將結(jié)果發(fā)送回來;驅(qū)動程序?qū)⒔Y(jié)果(字符串)傳給程序,如有需要,還可以自動翻譯成程序能識別的變量類型(如整型)。

3.斷開連接。

可見連接的速度、翻譯的速度和接受響應(yīng)的及時性是最主要的3個方面。

弄明白這點后就不難發(fā)現(xiàn),與數(shù)據(jù)庫的執(zhí)行時間相比,這些只是很少的一部分;而且PHP和Python使用的都是C實現(xiàn),而JDBC是用Java實現(xiàn),所以根本不必?fù)?dān)心PHP和Python的性能。
不過在翻譯方面還存在算法和實現(xiàn)上的差異,客戶端還可以緩存一些語句,所以仍然會出現(xiàn)一些性能上的差異。
為證明我的想法,我特意去測試了一番。

首先列出測試平臺:

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),臨河企業(yè)網(wǎng)站建設(shè),臨河品牌網(wǎng)站建設(shè),網(wǎng)站定制,臨河網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,臨河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

引用

CPU:Intel Core2 Duo T9400 @ 2.53GHz
內(nèi)存:3GB
操作系統(tǒng):Windows XP Pro SP2
MySQL:5.1.36
Java:1.6.0_17-b04
JDBC:MySQL Connector/J 5.1.10
PHP:5.2.11 (cli)
MySQLi:5.2.11.11
Python:2.6.4
MySQL-Python:1.2.3c1 

所用的庫都是最新版的,也都采用了最為推薦的庫。
但數(shù)據(jù)庫并沒有使用最新的穩(wěn)定版,因為我懶得重下了。5.4.3-beta測試版也試過,在連續(xù)插入時,性能比5.1快1~2個數(shù)量級,估計是服務(wù)器端緩存和設(shè)置的原因。

測試項目:

1.創(chuàng)建100萬個隨機數(shù),并生成插入這些隨機數(shù)的SQL語句。

2.連接本地數(shù)據(jù)庫,如不成功,嘗試創(chuàng)建數(shù)據(jù)庫。

3.刪除并創(chuàng)建數(shù)據(jù)庫表,引擎類型為InnoDB,主鍵為自動遞增的整數(shù),此外有個浮點型的字段(無索引)。

4.分成100組,每次插入1萬個隨機數(shù)。(因為每組的執(zhí)行量都很大,因此啟用自動提交事務(wù)。)

5.用SELECT COUNT(*)統(tǒng)計小于0.1的隨機數(shù)個數(shù)。(約10萬個)

6.用SELECT *取出再統(tǒng)計大于0.9的隨機數(shù)個數(shù)。(約10萬個)

7.將所有0.4~0.5之間的隨機數(shù)加1。(約10萬個)

8.將所有0.5~0.6之間的行刪除。(約20萬個)

9.斷開數(shù)據(jù)庫連接。

10.再次連接數(shù)據(jù)庫。

測試代碼:

Java:

Java代碼  Java、PHP、Python與MySQL交互的性能測試

  1. import java.sql.Connection;

  2. import java.sql.DriverManager;

  3. import java.sql.SQLException;

  4. import java.sql.Statement;

  5. import java.sql.ResultSet;

  6. import java.util.Random;

  7. public final class Test {

  8.     public static void main(String[] args) {

  9.         final int SIZE1 = 10000;

  10.         final int SIZE2 = 100;

  11.         final String DB_ENGINE = "InnoDB"; // InnoDB Memory MyISAM

  12.         final double NANO_TIME_PER_SEC = 1000000000.0;

  13.         System.out.printf("測試數(shù)據(jù)量:%d\n", SIZE1 * SIZE2);

  14.         System.out.printf("測試引擎:%s\n", DB_ENGINE);

  15.         long t1 = System.nanoTime(), t2, t3 = 0, t4, t5, t6, t7, t8, t9, t10, t11;

  16.         Connection conn = null;

  17.         Statement stmt = null;

  18.         ResultSet rs = null;

  19.         Random r = new Random();

  20.         String[] sqls = new String[SIZE2];

  21.         for (int i = 0; i < SIZE2; ++i){

  22.             StringBuilder buffer = new StringBuilder("INSERT INTO test (value) VALUES (");

  23.             for (int j = 0; j < SIZE1; ++j){

  24.                 buffer.append(r.nextDouble()).append("),(");

  25.             }

  26.             sqls[i] = buffer.substring(0, buffer.length() -2);

  27.         }

  28.         t2 = System.nanoTime();

  29.         try {

  30.             conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb?user=root&password=123456");

  31.             t3 = System.nanoTime();

  32.             stmt = conn.createStatement();

  33.         } catch (SQLException e) {

  34.             try {

  35.                 conn = DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=123456");

  36.                 t3 = System.nanoTime();

  37.                 stmt = conn.createStatement();

  38.                 stmt.execute("CREATE DATABASE testdb");

  39.             } catch (SQLException ex) {

  40.                 System.out.println("SQLException: " + ex.getMessage());

  41.                 System.out.println("SQLState: " + ex.getSQLState());

  42.                 System.out.println("VendorError: " + ex.getErrorCode());

  43.             }

  44.         }

  45.         try {

  46.             stmt.execute("DROP TABLE test");

  47.         } catch (SQLException e) {

  48.         }

  49.         try {

  50.             stmt.execute("CREATE TABLE test (`id` INT AUTO_INCREMENT PRIMARY KEY, `value` REAL) ENGINE = " + DB_ENGINE);

  51.         } catch (SQLException e) {

  52.         }

  53.         t4 = System.nanoTime();

  54.         try {

  55.             for (String sql: sqls){

  56.                 stmt.execute(sql);

  57.             }

  58.             t5 = System.nanoTime();

  59.             rs = stmt.executeQuery("SELECT COUNT(*) FROM test WHERE value < 0.1");

  60.             if (rs.next())

  61.                 System.out.printf("共有%d個小于0.1的隨機數(shù)\n", rs.getInt(1));

  62.             t6 = System.nanoTime();

  63.             rs = stmt.executeQuery("SELECT * FROM test WHERE value > 0.9");

  64.             if (rs.last())

  65.                 System.out.printf("共有%d個大于0.9的隨機數(shù)\n", rs.getRow());

  66.             t7 = System.nanoTime();

  67.             stmt.executeUpdate("UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5");

  68.             t8 = System.nanoTime();

  69.             stmt.execute("DELETE FROM test WHERE value > 0.5 AND value < 0.6");

  70.             t9 = System.nanoTime();

  71.             stmt.close();

  72.             conn.close();

  73.             t10 = System.nanoTime();

  74.             conn = DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=123456");

  75.             t11 = System.nanoTime();

  76.             conn.close();

  77.             System.out.printf("創(chuàng)建隨機數(shù):%f\n", (t2 - t1) / NANO_TIME_PER_SEC);

  78.             System.out.printf("初次連接數(shù)據(jù)庫:%f\n", (t3 - t2) / NANO_TIME_PER_SEC);

  79.             System.out.printf("再次連接數(shù)據(jù)庫:%f\n", (t11 - t10) / NANO_TIME_PER_SEC);

  80.             System.out.printf("初始化數(shù)據(jù)庫和表:%f\n", (t4 - t3) / NANO_TIME_PER_SEC);

  81.             System.out.printf("插入:%f\n", (t5 - t4) / NANO_TIME_PER_SEC);

  82.             System.out.printf("選擇(COUNT):%f\n", (t6 - t5) / NANO_TIME_PER_SEC);

  83.             System.out.printf("選擇:%f\n", (t7 - t6) / NANO_TIME_PER_SEC);

  84.             System.out.printf("更新:%f\n", (t8 - t7) / NANO_TIME_PER_SEC);

  85.             System.out.printf("刪除:%f\n", (t9 - t8) / NANO_TIME_PER_SEC);

  86.             System.out.printf("關(guān)閉連接:%f\n", (t10 - t9) / NANO_TIME_PER_SEC);

  87.             System.out.printf("總時間:%f\n", (t10 - t1) / NANO_TIME_PER_SEC);

  88.         } catch (SQLException ex) {

  89.             System.out.println("SQLException: " + ex.getMessage());

  90.             System.out.println("SQLState: " + ex.getSQLState());

  91.             System.out.println("VendorError: " + ex.getErrorCode());

  92.         }

  93.     }

  94. }

PHP:

Php代碼  Java、PHP、Python與MySQL交互的性能測試

  1. <?php

  2. define('SIZE1', 10000);

  3. define('SIZE2', 100);

  4. define('DB_ENGINE', 'InnoDB'); // InnoDB Memory MyISAM

  5. printf("測試數(shù)據(jù)量:%d\n", SIZE1 * SIZE2);

  6. printf("測試引擎:%s\n", DB_ENGINE);

  7. $t1 = microtime(true);

  8. for ($i = 0; $i < SIZE2; ++$i){

  9.     for ($j = 0; $j < SIZE1; ++$j){

  10.         $buffer[] = lcg_value();

  11.     }

  12.     $sqls[$i] = 'INSERT INTO test (value) VALUES ('.join('),(', $buffer).')';

  13.     unset($buffer);

  14. }

  15. $t2 = microtime(true);

  16. $db = new mysqli('localhost', 'root', '123456', 'testdb');

  17. $t3 = microtime(true);

  18. if (mysqli_connect_errno()) {

  19.     $db = new mysqli('localhost', 'root', '123456');

  20.     $t3 = microtime(true);

  21.     $db->query('CREATE DATABASE testdb');

  22.     $db->select_db('testdb');

  23. }

  24. $db->query('DROP TABLE test');

  25. $db->query('CREATE TABLE test (`id` INT AUTO_INCREMENT PRIMARY KEY, `value` REAL) ENGINE = '.DB_ENGINE);

  26. $t4 = microtime(true);

  27. foreach ($sqls as $key=>$sql) {

  28.     $db->query($sql);

  29. }

  30. $t5 = microtime(true);

  31. $result = $db->query('SELECT COUNT(*) FROM test WHERE value < 0.1')->fetch_row();

  32. printf("共有%d個小于0.1的隨機數(shù)\n", $result[0]);

  33. $t6 = microtime(true);

  34. $result = $db->query('SELECT * FROM test WHERE value > 0.9');

  35. printf("共有%d個大于0.9的隨機數(shù)\n", $result->num_rows);

  36. $t7 = microtime(true);

  37. $db->query('UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5');

  38. $t8 = microtime(true);

  39. $db->query('DELETE FROM test WHERE value > 0.5 AND value < 0.6');

  40. $t9 = microtime(true);

  41. $db->close();

  42. $t10 = microtime(true);

  43. $db = new mysqli('localhost', 'root', '123456', 'testdb');

  44. $t11 = microtime(true);

  45. $db->close();

  46. printf("創(chuàng)建隨機數(shù):%f\n", $t2 - $t1);

  47. printf("初次連接數(shù)據(jù)庫:%f\n", $t3 - $t2);

  48. printf("再次連接數(shù)據(jù)庫:%f\n", $t11 - $t10);

  49. printf("初始化數(shù)據(jù)庫和表:%f\n", $t4 - $t3);

  50. printf("插入:%f\n", $t5 - $t4);

  51. printf("選擇(COUNT):%f\n", $t6 - $t5);

  52. printf("選擇:%f\n", $t7 - $t6);

  53. printf("更新:%f\n", $t8 - $t7);

  54. printf("刪除:%f\n", $t9 - $t8);

  55. printf("關(guān)閉連接:%f\n", $t10 - $t9);

  56. printf("總時間:%f\n", $t10 - $t1);

  57. ?>

Python:

Python代碼  Java、PHP、Python與MySQL交互的性能測試

  1. # -*- coding: gbk -*-

  2. import MySQLdb

  3. from random import random

  4. from time import clock

  5. SIZE1 = 10000

  6. SIZE2 = 100

  7. DB_ENGINE = 'InnoDB' # InnoDB Memory MyISAM

  8. print '測試數(shù)據(jù)量:', SIZE1 * SIZE2

  9. print '測試引擎:', DB_ENGINE

  10. t1 = clock()

  11. sqls = ['INSERT INTO test (value) VALUES (%s)' % '),('.join([`random()` for i in xrange(SIZE1)]) for j in xrange(SIZE2)]

  12. t2 = clock()

  13. try:

  14.   con = MySQLdb.connect(user='root', passwd='123456', db='testdb')

  15.   t3 = clock()

  16.   cu = con.cursor()

  17. except:

  18.   con = MySQLdb.connect(user='root', passwd='123456')

  19.   t3 = clock()

  20.   cu = con.cursor()

  21.   cu.execute('CREATE DATABASE testdb')

  22.   con.select_db('testdb')

  23. con.autocommit(True)

  24. try:

  25.   cu.execute('DROP TABLE test')

  26. except:

  27.   pass

  28. cu.execute('''''CREATE TABLE test (

  29. `id` INT AUTO_INCREMENT PRIMARY KEY,

  30. `value` REAL)

  31. ENGINE = %s''' % DB_ENGINE)

  32. t4 = clock()

  33. for sql in sqls:

  34.   cu.execute(sql)

  35. t5 = clock()

  36. cu.execute('SELECT COUNT(*) FROM test WHERE value < 0.1')

  37. print '共有%d個小于0.1的隨機數(shù)' % cu.fetchone()[0]

  38. t6 = clock()

  39. cu.execute('SELECT * FROM test WHERE value > 0.9')

  40. print '共有%d個大于0.9的隨機數(shù)' % len(cu.fetchall())

  41. t7 = clock()

  42. cu.execute('UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5')

  43. t8 = clock()

  44. cu.execute('DELETE FROM test WHERE value > 0.5 AND value < 0.6')

  45. t9 = clock()

  46. cu.close()

  47. con.close()

  48. t10 = clock()

  49. con = MySQLdb.connect(user='root', passwd='123456', db='testdb')

  50. t11 = clock()

  51. con.close()

  52. print '創(chuàng)建隨機數(shù):', t2 - t1

  53. print '初次連接數(shù)據(jù)庫:', t3 - t2

  54. print '再次連接數(shù)據(jù)庫:', t11 - t10

  55. print '初始化數(shù)據(jù)庫:', t4 - t3

  56. print '插入:', t5 - t4

  57. print '選擇(COUNT)', t6 - t5

  58. print '選擇:', t7 - t6

  59. print '更新:', t8 - t7

  60. print '刪除:', t9 - t8

  61. print '關(guān)閉連接:', t10 - t9

  62. print '總時間:', t10 - t1

MySQL-Python還有個底層的模塊,一并測試下:

Python代碼  Java、PHP、Python與MySQL交互的性能測試

  1. # -*- coding: gbk -*-

  2. import _mysql

  3. from MySQLdb.converters import conversions

  4. from random import random

  5. from time import clock

  6. SIZE1 = 10000

  7. SIZE2 = 100

  8. DB_ENGINE = 'InnoDB' # InnoDB Memory MyISAM

  9. print '測試數(shù)據(jù)量:', SIZE1 * SIZE2

  10. print '測試引擎:', DB_ENGINE

  11. t1 = clock()

  12. sqls = ['INSERT INTO test (value) VALUES (%s)' % '),('.join([`random()` for i in xrange(SIZE1)]) for j in xrange(SIZE2)]

  13. t2 = clock()

  14. try:

  15.   con = _mysql.connect(user='root', passwd='123456', db='testdb', conv=conversions)

  16.   t3 = clock()

  17. except:

  18.   con = _mysql.connect(user='root', passwd='123456', conv=conversions)

  19.   t3 = clock()

  20.   con.query('CREATE DATABASE testdb')

  21.   con.select_db('testdb')

  22. con.autocommit(True)

  23. try:

  24.   con.query('DROP TABLE test')

  25. except:

  26.   pass

  27. con.query('''''CREATE TABLE test (

  28. `id` INT AUTO_INCREMENT PRIMARY KEY,

  29. `value` REAL)

  30. ENGINE = %s''' % DB_ENGINE)

  31. t4 = clock()

  32. for sql in sqls:

  33.   con.query(sql)

  34. t5 = clock()

  35. con.query('SELECT COUNT(*) FROM test WHERE value < 0.1')

  36. print '共有%d個小于0.1的隨機數(shù)' % con.store_result().fetch_row()[0]

  37. t6 = clock()

  38. con.query('SELECT * FROM test WHERE value > 0.9')

  39. print '共有%d個大于0.9的隨機數(shù)' % con.store_result().num_rows()

  40. t7 = clock()

  41. con.query('UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5')

  42. t8 = clock()

  43. con.query('DELETE FROM test WHERE value > 0.5 AND value < 0.6')

  44. t9 = clock()

  45. con.close()

  46. t10 = clock()

  47. con = _mysql.connect(user='root', passwd='123456', db='testdb', conv=conversions)

  48. t11 = clock()

  49. con.close()

  50. print '創(chuàng)建隨機數(shù):', t2 - t1

  51. print '初次連接數(shù)據(jù)庫:', t3 - t2

  52. print '再次連接數(shù)據(jù)庫:', t11 - t10

  53. print '初始化數(shù)據(jù)庫:', t4 - t3

  54. print '插入:', t5 - t4

  55. print '選擇(COUNT)', t6 - t5

  56. print '選擇:', t7 - t6

  57. print '更新:', t8 - t7

  58. print '刪除:', t9 - t8

  59. print '關(guān)閉連接:', t10 - t9

  60. print '總時間:', t10 - t1

每種測試3次(等硬盤燈無閃爍后才進行下一次測試),取最好的一次作為測試結(jié)果:
Java:

引用

測試數(shù)據(jù)量:1000000
測試引擎:InnoDB
共有99465個小于0.1的隨機數(shù)
共有99859個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù):2.367840
初次連接數(shù)據(jù)庫:0.220420
再次連接數(shù)據(jù)庫:0.013174
初始化數(shù)據(jù)庫和表:0.075140
插入:12.139346
選擇(COUNT):1.130345
選擇:1.017769
更新:6.173245
刪除:9.380070
關(guān)閉連接:0.002131
總時間:32.506307

PHP:

引用

測試數(shù)據(jù)量:1000000
測試引擎:InnoDB
共有99898個小于0.1的隨機數(shù)
共有100152個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù):1.506294
初次連接數(shù)據(jù)庫:0.003146
再次連接數(shù)據(jù)庫:0.001808
初始化數(shù)據(jù)庫和表:0.131754
插入:12.046944
選擇(COUNT):1.236742
選擇:1.238153
更新:6.115232
刪除:8.145547
關(guān)閉連接:0.000125
總時間:30.423937

Python(MySQLdb):

引用

測試數(shù)據(jù)量: 1000000
測試引擎: InnoDB
共有100040個小于0.1的隨機數(shù)
共有100351個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù): 1.6822107279
初次連接數(shù)據(jù)庫: 0.0332120423126
再次連接數(shù)據(jù)庫: 0.00221704155137
初始化數(shù)據(jù)庫: 0.131054924578
插入: 11.7999030603
選擇(COUNT) 1.27067266929
選擇: 1.16714526567
更新: 6.29200638629
刪除: 8.13660563005
關(guān)閉連接: 0.000131022238861
總時間: 30.5129417286

Python(_mysql):

引用

測試數(shù)據(jù)量: 1000000
測試引擎: InnoDB
共有99745個小于0.1的隨機數(shù)
共有99869個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù): 1.68099074044
初次連接數(shù)據(jù)庫: 0.0112056141213
再次連接數(shù)據(jù)庫: 0.00159293988482
初始化數(shù)據(jù)庫: 0.130169616529
插入: 12.1364623157
選擇(COUNT) 1.125517908
選擇: 0.968366649951
更新: 6.8042843434
刪除: 8.9760508668
關(guān)閉連接: 9.61015995031e-05
總時間: 31.8331441566

可以看到,在大批量數(shù)據(jù)測試中,Java是最慢的,而PHP是最快的。
不考慮IO性能的波動的話,Java主要慢在連接和關(guān)閉數(shù)據(jù)庫。JDBC 4.0在第一次連接數(shù)據(jù)庫時會動態(tài)加載驅(qū)動,非常耗時,因此使用Java要記住使用數(shù)據(jù)庫連接池,避免連接浪費大量時間。當(dāng)然,這也造成了數(shù)據(jù)庫的負(fù)擔(dān),勢必影響內(nèi)存占用。而創(chuàng)建隨機數(shù)的算法實現(xiàn)各不相同,所以不具備可比性;令我驚訝的是SELECT的翻譯速度,將字符串轉(zhuǎn)換成浮點數(shù)居然慢于Python,要知道后者的浮點數(shù)可是對象。
PHP連接數(shù)據(jù)庫非???,所以完全無需使用連接池,因為維護連接池會增加復(fù)雜性。
Python的表現(xiàn)和PHP差不多,但是第一次連接數(shù)據(jù)庫比較慢(仍比Java快1個數(shù)量級)。如果不用連接池,則使用FCGI等方式來運行比較合適。_mysql模塊的通信很快,但更新和刪除操作卻不太理想,也許是IO性能波動的原因。此外,我在連接數(shù)據(jù)庫時使用了轉(zhuǎn)換參數(shù),實際上我用的語句都不需要翻譯,不使用的話會更快一點。

接著試試小數(shù)據(jù),改成最常用的MyISAM引擎,插入100條(1組)。一般的應(yīng)用不可能一次插入那么多,所以足夠滿足平時的應(yīng)用了;而且由于數(shù)據(jù)量很小,也基本不受IO影響。

測試結(jié)果:

Java:

引用

測試數(shù)據(jù)量:100
測試引擎:MyISAM
共有9個小于0.1的隨機數(shù)
共有10個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù):0.001596
初次連接數(shù)據(jù)庫:0.224135
再次連接數(shù)據(jù)庫:0.018656
初始化數(shù)據(jù)庫和表:0.055601
插入:0.001476
選擇(COUNT):0.000529
選擇:0.000433
更新:0.000304
刪除:0.000313
關(guān)閉連接:0.000927
總時間:0.285314

PHP:

引用

測試數(shù)據(jù)量:測試數(shù)據(jù)量:100
測試引擎:MyISAM
共有12個小于0.1的隨機數(shù)
共有9個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù):0.000649
初次連接數(shù)據(jù)庫:0.008077
再次連接數(shù)據(jù)庫:0.001609
初始化數(shù)據(jù)庫和表:0.060421
插入:0.001860
選擇(COUNT):0.000580
選擇:0.000465
更新:0.000326
刪除:0.000373
關(guān)閉連接:0.000127
總時間:0.072878

Python(MySQLdb):

引用

測試數(shù)據(jù)量: 100
測試引擎: MyISAM
共有14個小于0.1的隨機數(shù)
共有9個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù): 0.000198907961766
初次連接數(shù)據(jù)庫: 0.0334640296462
再次連接數(shù)據(jù)庫: 0.00150577796899
初始化數(shù)據(jù)庫: 0.0123194428342
插入: 0.00125211444471
選擇(COUNT) 0.000581079438867
選擇: 0.000484139744018
更新: 0.000250311142897
刪除: 0.000262323842835
關(guān)閉連接: 7.98984228442e-05
總時間: 0.0488922474784

Python(_mysql):

引用

測試數(shù)據(jù)量: 100
測試引擎: MyISAM
共有12個小于0.1的隨機數(shù)
共有10個大于0.9的隨機數(shù)
創(chuàng)建隨機數(shù): 0.000214273043082
初次連接數(shù)據(jù)庫: 0.0118774872225
再次連接數(shù)據(jù)庫: 0.00123702872851
初始化數(shù)據(jù)庫: 0.0315031659052
插入: 0.00120322554962
選擇(COUNT) 0.000596165155069
選擇: 0.000507327048549
更新: 0.0002447238406
刪除: 0.00026148574749
關(guān)閉連接: 5.78285787719e-05
總時間: 0.0464656820909

從結(jié)果可以看出,雖然差距都很小,但Python仍然稍微占優(yōu)。不過Java的SELECT操作稍微勝出,而這也是實際應(yīng)用中最常使用的操作。
再從語言方面來看,Python無疑是寫得最歡暢的,生成隨機數(shù)只用了1行代碼;PHP的變量要寫個$讓我老是出錯,不過數(shù)據(jù)庫操作不需要處理異常,這點節(jié)省了很多代碼;Java的代碼量很大,而且不得不使用很多try...catch,我甚至懶得以安全的方式將close()放在finally塊里面,因為它也會拋出我根本懶得去管的異常,且會提示我計時變量可能沒有初始化。

總體上來看,Google放棄Python,只采用C++和Java是有點不明智。因為頁面響應(yīng)時間主要在于數(shù)據(jù)庫通信和磁盤文件IO上,語言的影響基本忽略不計。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:Java、PHP、Python與MySQL交互的性能測試-創(chuàng)新互聯(lián)
文章位置:http://muchs.cn/article44/dcpehe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)動態(tài)網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、網(wǎng)站排名、App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司