2013-05-27 3 views
3

간단한 테스트 응용 프로그램이 다른 결과를주는 이유를 파악하는 데 도움이 될지 궁금합니다. 간단한 데이터베이스 쿼리를 만들고 결과를 반복하는 두 가지 테스트 프로그램을 만들었습니다. 첫 번째는 PHP를 사용하여 만들어졌으며 두 번째 것은 Java로 만들어졌습니다.간단한 sql 쿼리를 만들 때 Java와 PHP

나는 자바가 더 잘 수행 될 것이라는 것을 알았지 만 자바가 거의 20 배는 더 잘 수행 할 것이라고 믿기가 힘듭니다 (아래 결과 참조).

PHP :

$sql = "select * from message where user_id=20"; 
$db = get_PDO(); 
$stm = $db->prepare($sql); 
for($i=0;$i<10000;$i++) 
{ 
    echo $i."\n"; 
    $res = $stm->execute(); 
    $rows = $stm->fetchAll(); 
} 
echo "done"; 

get_PDO 그냥 데이터베이스에 연결하고 PDO 객체를 반환하는 함수이다.

자바 :

public class Connect 
{ 
    public static void main (String[] args) 
    { 
     Connection conn = null; 
     Statement st= null; 

     try 
     { 
      String userName = ""; // db username 
      String password = ""; // db password 
      String url = "jdbc:mysql://localhost/test"; //test = db name 
      Class.forName ("com.mysql.jdbc.Driver").newInstance(); 
      conn = DriverManager.getConnection (url, userName, password); 
      System.out.println ("Database connection established"); 
     } 
     catch (Exception e) 
     { 
      System.err.println ("Cannot connect to database server: "+e.toString()); 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       String query="select * from message where user_id=20"; 

       try{ 
        st = conn.createStatement(); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
        try{ 
         conn.close(); 
        } 
        catch(Exception er) {} 
        return; 
       } 

       for(int i=0;i<10000;i++) 
       { 
        System.out.println(i); 
        try 
        { 
         ResultSet rs = st.executeQuery(query); 
         while(rs.next()) 
         { 
         } 
        } 
        catch(Exception e) 
        { 
         e.printStackTrace(); 
        } 
       } 
       try 
       { 
        conn.close(); 
        System.out.println ("Database connection terminated"); 
       } 
       catch (Exception e) { /* ignore close errors */ } 
      } 
     } 
    } 
} 

결과 :

나는 시간을 사용하여 성능을 측정 하였다. (즉, 시간의 PHP test.php 및 시간 자바에 연결합니다.)

PHP :

real 1m34.337s 
user 1m32.564s 
sys  0m0.716s 

자바 :

real 0m5.388s 
user 0m4.428s 
sys  0m0.972s 

정말 훨씬 더 빨리 또는 내가 바보 같은 짓을 한 자바인가? :)

+0

정말 실마리가 없지만, java는 "st.executeQuery (query)"로 결과 캐싱을 수행합니다. – aderuwe

+0

Hmh. 루프 내부에서 createStatement() 파트를 이동했습니다. 결과가 조금 바뀌 었습니다. 이제 java를 사용하여 다음 결과를 얻습니다. real \t 0m13.731s user \t 0m44.996s sys \t 0m3.740s – hefa

+0

오 마이 악. 나는 그 루프 안에 st.close()를 추가하지 않았다. 그 후 소비 된 시간은 다시 실제로 떨어졌습니다. \t 0m6.542s 사용자 \t 0m5.852s sys \t 0m0.848s – hefa

답변

1
  1. fetchAll()을 호출 한 후 전체 결과 집합이 유지되기 때문에 PHP는 메시지 수에 따라 더 많은 메모리가 필요할 수 있습니다.
  2. AFAIK PHP는 결과를위한 연관 배열을 생성합니다. 이는 또한 시간이 많이 걸릴 수도 있습니다.
  3. PHP에서는 fetchAll()을 호출하여 데이터베이스의 모든 데이터를 검색 할 수 있지만 Java에서는 실제로 읽을 필요없이 rs.next()을 사용하여 결과 세트를 이동하기 만하면됩니다. JDBC 드라이버 구현에 따라 PHP 버전이 구현되는 방식으로 최적화 할 수없는 기회가 될 수 있습니다.
+0

고마워. 1. 가져 오기를 사용하도록 PHP를 변경하고 40 초를 해제했습니다. 이제 PHP가 걸립니다 : 진짜 \t 0m43.256s 사용자 \t 0m41.048s sys \t 0m1.452s. 2. 나는이 행동을 바꾸는 길을 찾지 못했습니다. 너는 어떤 것을 알고 있니? 3. j = rs를 더했습니다.getInt ("id"); Java 결과 세트 처리 내부. 아무런 효과가 없었다. – hefa

관련 문제