- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
测试更新为更具可读性;全部在 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/
我是 Mercurial 的新手,并且不知何故仍处于评估过程中,所以这四个概念对我来说有点困惑。有些被提到等同于 Git 的 Staging/Index 概念,有些甚至比 Git 的 Staging
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6 个月前关闭。 Improve this ques
任何人都可以给我详细信息吗? 例如? #ID 是属性、特性、选择器还是 anchor ? 默认属性和默认属性是不同的东西吗? 这些都是标签还是元素? 我们将对此说些什么 这个 ..... 还有这些
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我有一个由 Javascript 填充的下拉列表。 在决定加载时显示的默认值时,我意识到以下属性显示的值完全相同: innerText innerHTML label text textContent
我可以知道每个 Exec 之间有什么区别吗? , ExecWait , ExecShell , nsExec::Exec , nsExec::ExecToLog, nsExec::ExecToStac
当您处于版本 1 和版本 2 之间时,您会如何维护您的软件? 从我的角度来看,“补丁”、“修补程序”、“维护版本”、“服务包”等术语都很模糊,根据与您交谈的对象不同,定义也不同。 您如何称呼版本之间的
我刚刚发现在 ES6 中有一个新的数学方法:Math.trunc . 我在 MDN article 中阅读了它的描述。 , 听起来像使用 |0 . 此外,>0 , &-1 , ^0也做类似的事情(感谢
我想知道我的 StackPanel 所有项目的高度。 有什么区别: Height - 获取或设置元素的建议高度。 ActualHeight - 获取该元素的渲染高度。 (只读) ExtentHeigh
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我对所有声称以某种方式阻止计算的内置 Mathematica 函数感到困惑:Unevaluated、Defer、Hold ,以及超过 6 个 Hold* 形式。 Mathematica 文档只是单独解
我什至不确定正确的术语,所以让我从我的目标开始:拥有一个简单的应用程序(“Data Doler”),它只会将大量数据从文件读取到内存中,然后提供服务将该数据切片到名为“Data Lapper”的单个多
我刚刚开始在我的项目中使用 Elasticsearch,我想像 sql 关键字一样搜索 '喜欢%' 做。 谁能解释一下 之间的区别通配符 , 前缀 , 查询字符串和 正则表达式 ? 哪个可以搜索最好性
由于我对任何主流浏览器(Firefox、Chrome、Opera)都不太满意,而且我尝试过的不太受欢迎的浏览器(近十几种)都没有,所以我决定 DIY 并制作一个网页我想要最好的浏览器。 主要目标是让它
我知道如何使用 Python 解析页面。我的问题是哪种方法是所有解析技术中最快的,其他方法的速度有多快? 我知道的解析技术有Xpath、DOM、BeautifulSoup,还有使用Python的fin
我试图从正在解析的命令行中找出哪个函数最适合将十进制、十六进制或八进制数转换为 int 最好——在不知道输入的情况下事先。 目标是使用一个函数来识别不同类型的输入并将其分配给它的整数 (int) 值,
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们需要在我们的网站上显示酒吧、餐馆和剧院等各种场所的元信息(例如,地址、姓名)。 理想情况下,用户会输入地点名称以及邮政编码,我们会提供最接近的匹配项。 人们将哪些 API 用于类似的地理定位目的?
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在创建我的第一个 Web 应用程序,我真的很困惑应该使用什么技术。 我的应用程序需要看起来很严肃(像一个应用程序),它不需要很多色彩缤纷的图形界面。它只需要一个工具栏、一个标签栏、一个拆分面板(最
我是一名优秀的程序员,十分优秀!