2011-04-02 39 views
4

我目前有几个Java程序使用Cron读取和更新MySQL数据库。Java作为与MySQL交互的cron脚本vs使用PHP

我正在考虑将代码移植到PHP。在我这样做之前,我做了一个简单的基准测试SELECT,将某个表中的所有行存储在一个字符串中。

我循环10,000次PHP和Java程序。 PHP在5秒内运行它。 Java花了大约1分钟。

我对性能的差异感到惊讶。这是对的吗? Java真的很慢吗?或者我做错了什么?

我目前使用JDK 6和PHP CLI 5.3在CentOS 5.5中运行cron脚本。

这里是Java代码:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Statement; 

public class Test { 
    private Connection connection = null; 
    private Statement statement = null; 

    public static void main(String args[]) 
    { 
    (new Test()).run(); 
    } 

    private void initDB() { 
    try { 
     String url="jdbc:mysql://localhost:3306/db"; 
     Class.forName("org.gjt.mm.mysql.Driver"); 
     connection = DriverManager.getConnection(url, "username", "password"); 
     statement = connection.createStatement(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    private String getUserProfiles() 
    { 

    String query = "SELECT * FROM UserProfile;"; 
    String output = ""; 
    try 
    { 
     for(int i = 0; i < 10000; ++i) 
     { 
      ResultSet rs=statement.executeQuery(query); 
      while(rs.next()) 
       output += rs.getString("name"); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return output; 
    } 

/更多代码继续/

然后在PHP:

try 
{ 
    $db = new PDO("mysql:host=localhost;dbname=db;charset=utf8", 'username', 'password'); 
    $str = ""; 
    for($i=0; $i < 10000; ++$i) 
    { 
     $qry = $db->prepare('SELECT * FROM UserProfile;'); 

     $qry->execute(); 
     $result = $qry->fetchAll(PDO::FETCH_OBJ); 
     foreach($result as $profile) 
     { 
      $str .= $profile->name; 
     } 
    } 
} 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
    exit; 
} 
+0

提高在这种情况下,Java的字符串表现我真的认为我们将不得不看到两者的代码(或至少例子),作为对你怎么做。 – Joel 2011-04-02 03:35:17

+0

你可以尝试使用'PreparedStatement'而不是'Statement' – Nishan 2011-04-02 04:41:20

+0

刚刚用PreparedStatement尝试过,仍然运行得如此慢...... – samxli 2011-04-02 05:03:16

回答

0

我敢肯定,这将在很大程度上取决于在您为每种语言编写的代码上(与PHP相比,Java代码是什么样的?)。如此大的差异暗示某些事情是不同的。也许你正在建立或维护数据库连接的方式?

0

它看起来像你真正比较的是一种通过串联编译非常大的字符串的方法;这不是一个真正的数据库应用程序可能做的事情,而且你没有在Java中以最有效的方式做这件事(你在Java中以一种糟糕的方式做它)。

我确信你不应该根据这个人为的,执行不力的基准来选择语言。

考虑哪种语言对您而言具有更简单的代码。我建议你用PHP编写它,因为从代码来看,你对Java的掌握显然比较弱。

+0

我该如何重写基准以使其更好? – samxli 2011-04-03 03:40:25

1

您可以通过使用StringBuffer的

private String getUserProfiles() 
{ 
    String query = "SELECT * FROM UserProfile;"; 
    StringBuffer output = new StringBuffer(); 
    try 
    { 
     for(int i =0; i < 10000; ++i) 
     { 
      ResultSet rs=statement.executeQuery(query); 
      while(rs.next()) 
       output.append(rs.getString("name")); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return output.toString(); 
}