gpt4 book ai didi

php - SQL 基准 : PHP ActiveRecord ORM vs. MySQL 与 CodeIgniter Active Record 与标准 PHP

转载 作者:可可西里 更新时间:2023-11-01 08:20:38 26 4
gpt4 key购买 nike

测试更新为更具可读性;全部在 100 倍的 foreach 循环中完成。

测试查询是SELECT * FROM school_courses;

任何人都可以就以下方面提供“跳出框框思维”的反馈:

a) 为什么 PHP ActiveRecord ORM 需要 4 秒来根据以下结果执行相同的查询?

b) 这是用于比较查询方法的实用基准还是更多的假设基准?

c) 是否有其他方法(测试用例)我应该尝试(或修改这些方法)以获得更清晰的画面?

结果(使用 PDO 和 MySQLi)

Iterations: 100

PHP (config file)
Base Time: 5.793571472168E-5
Gross Time: 0.055607080459595
Net Time: 0.055549144744873

PHP ActiveRecord ORM
Base Time: 5.2213668823242E-5
Gross Time: 4.1013090610504
Net Time: 4.1012568473816

MySQL (standard)
Base Time: 5.1975250244141E-5
Gross Time: 0.32771301269531
Net Time: 0.32766103744507

CodeIgniter (Active Record)
Base Time: 5.1975250244141E-5
Gross Time: 0.28282189369202
Net Time: 0.28276991844177

MySQLi
Base Time: 5.1975250244141E-5
Gross Time: 0.20240592956543
Net Time: 0.20235395431519

PDO
Base Time: 5.2928924560547E-5
Gross Time: 0.17662906646729
Net Time: 0.17657613754272

测试

// Benchmark tests
$runs = 100;

// PHP (config file)
for ($i = 0; $i < $runs; $i++) {
$this->view_data['courses'] = course_info();
}

// PHP ActiveRecord ORM
for ($i = 0; $i < $runs; $i++) {
$this->view_data['courses'] = Course::all();
}

// mysql_* (MySQL standard; deprecated)
for ($i = 0; $i < $runs; $i++) {
$sql = mysql_query('SELECT * FROM school_courses') or die(mysql_error());
while ($row = mysql_fetch_object($sql)) {
array_push($this->view_data['courses'], $row);
}
}

// CodeIgniter (Active Record)
for ($i = 0; $i < $runs; $i++) {
$this->view_data['courses'] = $this->db->get('school_courses');
}

// mysqli_* (MySQLi)
for ($i = 0; $i < $runs; $i++) {
$res = $mysqli->query('SELECT * FROM school_courses');
while ($row = $res->fetch_object()) {
array_push($this->view_data['courses'], $row);
}
}

// PDO
for ($i = 0; $i < $runs; $i++) {
foreach($conn->query('SELECT * FROM school_courses') as $row) {
array_push($this->view_data['courses'], $row);
}
}

最佳答案

因此,PHP ActiveRecord ORM 在对并发连接进行基准测试时引入如此多开销的原因是,返回的每个结果都会实例化一个新的模型对象。这是使用此 ORM 库不可或缺的一部分,我看不出有任何合理的方法可以在不彻底检查整个库的情况下进行更改。

这是我发现的:

在 Table 类的 find_by_sql() 方法中,您有:

    $sth = $this->conn->query($sql,$this->process_data($values));

while (($row = $sth->fetch()))
{
$model = new $this->class->name($row,false,true,false);

if ($readonly)
$model->readonly();

if ($collect_attrs_for_includes)
$attrs[] = $model->attributes();

$list[] = $model;
}

具体来说,动态模型实例化 new $this->class->name() 负责开销,比方说,每个获取的结果大约 0.004。

您将其乘以现在的记录数,(10 条记录 = 0.04)。现在将其乘以并发连接数,比方说 100,就会出现可预见的瓶颈问题。

100 个用户(假设而言)同时访问包含 10 条记录的表需要四 (4) 秒。

此时我是否应该担心,由于该库为每条记录实例化模型类的方式,所提取的记录数量可能会导致瓶颈问题?

同样,假设正确使用 ORM,这一切都可能是假设的语音,在现实世界中可能永远不存在或存在问题。除非这些测试或结论不准确,否则我在这里尝试模拟的是 100、1,000 和 10,000 名活跃现场访问者的流量负载。

换句话说,如果我不添加其他类(class)(限制 10 个),例如,浏览类(class)页面的 10,000 名访问者是否会导致 400 秒(6.67 分钟)等待其他人离开页面?如果是这样的话,那么我将找到我自己的答案(因此写这篇文章),并将考虑寻找另一个 ORM 或根据具体情况求助于重构。

这是基准测试和模拟流量负载的最合适方法吗?

其他资源

如何使用ab工具对Apache进行压力测试 https://wiki.appnexus.com/display/documentation/How+to+Apache+Stress+Test+With+ab+Tool

关于php - SQL 基准 : PHP ActiveRecord ORM vs. MySQL 与 CodeIgniter Active Record 与标准 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13366155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com