Bil*_*eal 2 php performance phpunit mysqli
我的测试运行得很慢......我的测试不到100次,但在快速机器上运行仍需要10秒钟.我尝试禁用代码覆盖,并使用缓存来处理远程服务器(例如LDAP)所做的一些事情.
在PHPUnit运行时分析测试产生:

完全10%的运行时间 - 包括收集信息和生成大量代码覆盖页面的时间 - 花费在mysqli->prepare.不幸的是,我不能在这里抽象数据库.我不仅有效地测试数据库访问层本身,还有很多逻辑是JOIN根据被测代码中的s 实现的.
是否有任何可以更改的配置设置或任何此类性质的设置以使其更快?是否prepare需要调用mysql服务器(因此设置本地mysql服务器进行测试可能有帮助?)
是的,prepare()声明将调用MySQL服务器.准备好的语句在两个呼叫中在服务器端执行:PREPARE呼叫和EXECUTE呼叫.
每个例子:
mysql> PREPARE stmt1 FROM 'SELECT * FROM mysql.user';
mysql> EXECUTE stmt1;
Run Code Online (Sandbox Code Playgroud)
任何驱动程序都是如此,无论它是JDBC驱动程序的PHP驱动程序.为了进一步证明它确实进行了调用,请执行以下代码:
$mysqli->prepare('SELECT * FROM mysql.user');
Run Code Online (Sandbox Code Playgroud)
...你可以在MySQL中看到以下内容:
mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+--------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+------+---------+------+-------+--------------------------+
| 564 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 565 | root | localhost | NULL | Prepare | 0 | NULL | SELECT * FROM mysql.user |
+-----+------+-----------+------+---------+------+-------+--------------------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
要加速这一点,您可以在本地计算机上使用UNIX域套接字(假设您有POSIX OS).这消除了TCP握手和纠错的开销,以及因为它在本地执行而导致的网络延迟.
但是,最好的解决方案是使用模拟对象抽象数据库连接,但您已经知道了.如果必须连接到数据库,则单元测试不是单元测试:它是集成测试.
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |