用户
 找回密码
 入住 CI 中国社区
搜索
查看: 10388|回复: 20
收起左侧

CI 访问数据库和 PHP 直接访问数据库速度差距达80倍?

[复制链接]
发表于 2008-11-10 20:29:48 | 显示全部楼层 |阅读模式
数据库使用的是 Firebird 2.1, CI 驱动用的是论坛里 jianlei 兄弟提供的1.6.0的,我改成了 1.6.3
查询同样一个表,使用 CI 访问共耗时:1.6317658424377;使用 PHP 直接访问耗时:0.020084142684937
两者相差约80倍,这是什么原因呢? 不知道mysql数据库是否会有同样的问题?

代码如下:

PHP复制代码
 
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
 
        function RunTime_Begin()
        {
            global $_starttime;
            $_nowtime = explode(" ", microtime());
            $_starttime = $_nowtime[1] + $_nowtime[0];
        }
       
        function RunTime_End()
        {
            global $_starttime;
            $_nowtime = explode(" ", microtime());
            $_endtime = $_nowtime[1] + $_nowtime[0];
            $_totaltime = $_endtime - $_starttime;
            return $_totaltime;
        }      
 
class FbTest extends Controller {
 
        function FbTest()
        {
                parent::Controller();  
        }
 
       
        function index()
        {
                //phpinfo();
                runtime_begin();
                $db2 = $this->load->database('firebird', true);
                echo "<hr>connect time = ".RunTime_End()."<br>\n";     
 
                $query = $db2->query("select * from TVHC");
                echo "<hr>query time = ".RunTime_End()."<br>\n";       
               
                $i = 0;
               
                foreach ($query->result() as $row)
                {
                        $i++;
                        if ($i>20)
                                break;
 
                        echo $row->FID . ' ';
                        echo $row->FPLATENO . ' ';
                        //echo $row->FVal . ' ';
                        echo "<br>\n";
                       
                }
                echo "<hr>loop time = ".RunTime_End()."<br>\n";
               
               
               
               
        }
       
        function ibase_test()
        {
                RunTime_Begin();
                $db = ibase_connect('localhost:d:/dbdata/firebird/test.fdb', 'SYSDBA', 'masterkey');
                echo "<hr>connect time = ".RunTime_End()."<br>\n";     
 
                $query = ibase_query('select * from TVHC');
                echo "<hr>query time = ".RunTime_End()."<br>\n";       
               
                $i = 0;
                while( $row = ibase_fetch_assoc($query))
                {
                        $i++;
                        if ($i>20)
                                break;
                        echo $row['FID'] . ' ';
                        echo $row['FPLATENO'] . ' ';
                        echo "<br>\n";
                }      
 
                echo "<hr>loop time = ".RunTime_End()."<br>\n";
               
        }
       
}
?>
 
复制代码


index (CI 访问数据库)运行结果如下:
HTML复制代码
 
<hr>connect time = 0.026785850524902<br>
<hr>query time = 0.040149927139282<br>
9 京GTD670 <br>
10 京AC5259 <br>
11 京KQ3430 <br>
12 京HD9405 <br>
8 京GEB023 <br>
13 京LD3951 <br>
14 京FW8312 <br>
 
15 京JG4468 <br>
16 京GHV802 <br>
17 京GYA135 <br>
18 京GW0027 <br>
19 军A02139 <br>
20 京ER3268 <br>
21 京K44803 <br>
22 京J12111 <br>
23 京EX1420 <br>
 
24 京F81920 <br>
25 京FV8303 <br>
26 京AU3930 <br>
27 京LF6087 <br>
<hr>loop time = 1.6317658424377<br>
 
复制代码


ibase_test (PHP 直接访问数据库)运行结果如下:
HTML复制代码
 
<hr>connect time = 0.014124155044556<br>
<hr>query time = 0.017735004425049<br>
9 京GTD670 <br>
10 京AC5259 <br>
11 京KQ3430 <br>
12 京HD9405 <br>
8 京GEB023 <br>
13 京LD3951 <br>
14 京FW8312 <br>
 
15 京JG4468 <br>
16 京GHV802 <br>
17 京GYA135 <br>
18 京GW0027 <br>
19 军A02139 <br>
20 京ER3268 <br>
21 京K44803 <br>
22 京J12111 <br>
23 京EX1420 <br>
 
24 京F81920 <br>
25 京FV8303 <br>
26 京AU3930 <br>
27 京LF6087 <br>
<hr>loop time = 0.020084142684937<br>
 
 
复制代码
 楼主| 发表于 2008-11-10 20:31:15 | 显示全部楼层

不好意思 HTML 代码又贴错了

不好意思 HTML 代码又贴错了
 楼主| 发表于 2008-11-10 20:33:57 | 显示全部楼层

修改一下

index 执行结果
[code=HTML]
<html>
<body>
<hr>connect time = 0.026785850524902<br>
<hr>query time = 0.040149927139282<br>
9 京GTD670 <br>
10 京AC5259 <br>
11 京KQ3430 <br>
12 京HD9405 <br>
8 京GEB023 <br>
13 京LD3951 <br>
14 京FW8312 <br>

15 京JG4468 <br>
16 京GHV802 <br>
17 京GYA135 <br>
18 京GW0027 <br>
19 军A02139 <br>
20 京ER3268 <br>
21 京K44803 <br>
22 京J12111 <br>
23 京EX1420 <br>

24 京F81920 <br>
25 京FV8303 <br>
26 京AU3930 <br>
27 京LF6087 <br>
<hr>loop time = 1.6317658424377<br>

</body>
</html>
  1. ibase_test 执行结果
  2. [code=HTML]
  3. <html>
  4. <body>
  5. <hr>connect time = 0.014124155044556

  6. <hr>query time = 0.017735004425049

  7. 9 京GTD670

  8. 10 京AC5259

  9. 11 京KQ3430

  10. 12 京HD9405

  11. 8 京GEB023

  12. 13 京LD3951

  13. 14 京FW8312


  14. 15 京JG4468

  15. 16 京GHV802

  16. 17 京GYA135

  17. 18 京GW0027

  18. 19 军A02139

  19. 20 京ER3268

  20. 21 京K44803

  21. 22 京J12111

  22. 23 京EX1420


  23. 24 京F81920

  24. 25 京FV8303

  25. 26 京AU3930

  26. 27 京LF6087

  27. <hr>loop time = 0.020084142684937


  28. </body>
  29. </html>
复制代码
 楼主| 发表于 2008-11-10 20:54:42 | 显示全部楼层

CI 访问MySQL 同 PHP 直接访问速度差70倍

数据库用 MySQL,分别用 CI 和 PHP 直接访问 MySQL 数据库,时间也相差70多倍
查询同样一个表,使用 CI 访问共耗时:0.028937101364136;使用 PHP 直接访问耗时:0.0035531520843506

代码如下:
PHP复制代码
 
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
 
        function RunTime_Begin()
        {
            global $_starttime;
            $_nowtime = explode(" ", microtime());
            $_starttime = $_nowtime[1] + $_nowtime[0];
        }
       
        function RunTime_End()
        {
            global $_starttime;
            $_nowtime = explode(" ", microtime());
            $_endtime = $_nowtime[1] + $_nowtime[0];
            $_totaltime = $_endtime - $_starttime;
            return $_totaltime;
        }      
 
class MysqlTest extends Controller {
 
 
        function MysqlTest()
        {
                parent::Controller();  
        }
       
        function index()
        {
                RunTime_Begin();
                $db2 = $this->load->database('default', true);
                echo "<hr>connect time = ".RunTime_End()."<br>\n";     
                $query = $db2->query("select * from TCode");
                echo "<hr>query time = ".RunTime_End()."<br>\n";       
               
                $i = 0;
                foreach ($query->result() as $row)
                {
                        $i++;
                        if ($i>20)
                                break;                 
 
                        echo $row->FID . ' ';
                        echo $row->FCode . ' ';
                        echo $row->FVal . ' ';
                        echo "<br>\n";
                }
                echo "<hr>loop time = ".RunTime_End()."<br>\n";
        }
 
        function mysql_test()
        {
                runtime_begin();
                $cn = mysql_connect("127.0.0.1", "root", "root");
                echo "<hr>connect time = ".RunTime_End()."<br>\n";     
                $db = mysql_select_db("test", $cn);
                $rs = mysql_query("select * from TCode");
                echo "<hr>query time = ".RunTime_End()."<br>\n";       
               
                $i = 0;
                while( $row = mysql_fetch_assoc($rs))
                {
                        $i++;
                        if ($i>20)
                                break;
                        echo $row['FID'] . ' ';
                        echo $row['FCode'] . ' ';
                        echo $row['FVal'] . ' ';
                        echo "<br>\n";
                }      
                echo "<hr>loop time = ".RunTime_End()."<br>\n";
                mysql_close($cn);              
        }      
}
?>
 
复制代码


index 执行结果如下:
<hr>connect time = 0.023476123809814<br>
<hr>query time = 0.028537034988403<br>
1 0001 USER01 <br>
2 0002 USER02 <br>
3 0003 USER03 <br>
4 0004 USER04 <br>
5 0005 USER05 <br>
6 0006 USER06 <br>
7 0007 USER07 <br>

8 0008 USER08 <br>
9 0009 USER09 <br>
10 0010 USER10 <br>
11 0011 USER11 <br>
12 0012 USER12 <br>
13 0013 USER13 <br>
14 0014 USER14 <br>
15 0015 USER15 <br>
16 0016 USER16 <br>

17 0017 USER17 <br>
18 0018 USER18 <br>
19 0019 USER19 <br>
20 0020 USER20 <br>
<hr>loop time = 0.028937101364136<br>

mysql_test 执行结果如下:
<hr>connect time = 0.0026230812072754<br>
<hr>query time = 0.0034041404724121<br>
1 0001 USER01 <br>
2 0002 USER02 <br>
3 0003 USER03 <br>
4 0004 USER04 <br>
5 0005 USER05 <br>
6 0006 USER06 <br>
7 0007 USER07 <br>
8 0008 USER08 <br>
9 0009 USER09 <br>
10 0010 USER10 <br>
11 0011 USER11 <br>
12 0012 USER12 <br>
13 0013 USER13 <br>
14 0014 USER14 <br>
15 0015 USER15 <br>
16 0016 USER16 <br>

17 0017 USER17 <br>
18 0018 USER18 <br>
19 0019 USER19 <br>
20 0020 USER20 <br>
<hr>loop time = 0.0035531520843506<br>
 楼主| 发表于 2008-11-10 20:58:20 | 显示全部楼层

关于测试

刚接触 CI 框架,测试数据库时发现此问题,不知是何原因?
改用 MySQL 数据库测试结果也相差70多倍,为什么会这样???
CI不是具备速度优势吗?
发表于 2008-11-10 21:25:59 | 显示全部楼层
个人感觉 CI只适合快速原型开发和开发一些较小型的网站,我使用CI是因为他的 MVC结构,而没考虑他的效率问题。
发表于 2008-11-10 21:29:31 | 显示全部楼层
呵呵,这种测试太多了,使用框架肯定会有性能损失,楼主可以参考 http://codeigniter.org.cn/forums/thread-419-1-1.html
发表于 2008-11-10 21:29:46 | 显示全部楼层
对于 CI 不能开发大型应用的说法,只能是对 CI 的理解很肤浅,看看 www.iqwer.com 全站都是 CI 的,肯定不能算是小型应用。

楼主可以参考 http://codeigniter.org.cn/forums/thread-419-1-1.html
 楼主| 发表于 2008-11-10 21:42:09 | 显示全部楼层
这个速度对比并非正对 CI 开发大型应用而来,仅仅是一个数据库访问速度测试,
只是想搞明白为什么会出现上面的速度差异。

我做过简单的非数据库访问测试 CI 与直接用 PHP 写的没有多大差距,
而在数据库访问方面怎么会有如此大的差距,问题是出在哪里呢?
 楼主| 发表于 2008-11-10 21:47:46 | 显示全部楼层
使用框架确实会有性能损失,我的测试并不是表示 CI 的性能如何,因为影响性能的方面很多,
也有非CI方面的原因会影响到测试。
CI 我初次接触,并不熟悉,不能确定我用 CI访问数据库的方式是高效的。
但是我想出现我测试的如此大的差距,究竟是什么原因?
能否请各位都做一做类似的测试,看看各位的结果是什么,搞清楚我的测试的问题原因在那里。

本版积分规则