我什么时候应该在 PHP 中取消设置以提高性能
When should I unset in PHP to improve performance
我正在使用以下代码:
for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60
$t = $response[0][$x];
$query = "INSERT INTO tableX (time,title) VALUES ('$date','$t')";
if ($query_run = mysqli_query($mysql_connect, $query)) {
//Call some functions if the insertion happens
}
}
mysqli_close($mysql_connect);
table 中的标题是主键。我将仅在插入成功时调用一些函数,即没有提供现有标题。标题和日期来自 csv 文件。
如何提高这段代码的性能?我应该什么时候使用 unset
来节省 CPU 个内存周期?
取消设置不会通过此处任何有意义的指标提高性能。
将提高性能的是每次查询更新多行。
让我们以您的代码为例。这只是它如何可能的一个例子。如果您需要 运行 插入后的其他功能,那么您可能希望一次更新 10 或 100 行而不是所有行。
$query = "INSERT INTO tableX (time,title) VALUES ";
$valueQuery = array();
for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60
$t = $response[0][$x];
$valueQuery[] = "('$date','$t')";
}
$query .= implode(", ",$valueQuery);
if ($query_run = mysqli_query($mysql_connect, $query)) {
//Call some functions if the insertion happens
}
您可以通过为插入 (1) 使用准备好的语句来改进显示的代码。实际上,在每次迭代中,您首先必须定义 $query 然后执行。在每次执行中,数据库还必须首先解析您的语句。
通过在进入循环之前准备语句,您只需定义一次,就可以使用不同的值执行它。此外,语句只会在准备好时被解析,不会在每次执行时被解析。
这里有一篇关于 php 中的垃圾收集器如何工作的小文章:http://www.hackingwithphp.com/18/1/10, found in this question: Is there garbage collection in PHP?
PHP performs garbage collection at three primary junctures:
When you tell it to
When you leave a function
When the script ends
所以也许你应该检查你的程序有多少可以封装到函数中,尽管在你的代码片段中没有太多可看的。
(1)
我建议使用prepared statements来提高效率。减少工作量是 imo 的最佳实践 - 不必要的查询解析。
所以我没有对实际性能改进的估计,尽管因为这个案例是在谈论 50 到 60 次迭代,即使是值得注意的也是最小的。
这道题完全是基于错误的前提。
首先,在任何地方使用 unset 都不会为您节省一个 CPU 周期,而是会使用它们。
再说反正没地方放unset
最后,此代码没有 真正的 性能问题。如果您遇到任何问题,您应该测量它们,检测真正的瓶颈,然后修复它,而不是四处乱找树。
您真正关心的应该是您的代码对 sql 各种注入和语法错误敞开大门,而不是虚构的性能问题。
我正在使用以下代码:
for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60
$t = $response[0][$x];
$query = "INSERT INTO tableX (time,title) VALUES ('$date','$t')";
if ($query_run = mysqli_query($mysql_connect, $query)) {
//Call some functions if the insertion happens
}
}
mysqli_close($mysql_connect);
table 中的标题是主键。我将仅在插入成功时调用一些函数,即没有提供现有标题。标题和日期来自 csv 文件。
如何提高这段代码的性能?我应该什么时候使用 unset
来节省 CPU 个内存周期?
取消设置不会通过此处任何有意义的指标提高性能。
将提高性能的是每次查询更新多行。
让我们以您的代码为例。这只是它如何可能的一个例子。如果您需要 运行 插入后的其他功能,那么您可能希望一次更新 10 或 100 行而不是所有行。
$query = "INSERT INTO tableX (time,title) VALUES ";
$valueQuery = array();
for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60
$t = $response[0][$x];
$valueQuery[] = "('$date','$t')";
}
$query .= implode(", ",$valueQuery);
if ($query_run = mysqli_query($mysql_connect, $query)) {
//Call some functions if the insertion happens
}
您可以通过为插入 (1) 使用准备好的语句来改进显示的代码。实际上,在每次迭代中,您首先必须定义 $query 然后执行。在每次执行中,数据库还必须首先解析您的语句。
通过在进入循环之前准备语句,您只需定义一次,就可以使用不同的值执行它。此外,语句只会在准备好时被解析,不会在每次执行时被解析。
这里有一篇关于 php 中的垃圾收集器如何工作的小文章:http://www.hackingwithphp.com/18/1/10, found in this question: Is there garbage collection in PHP?
PHP performs garbage collection at three primary junctures:
When you tell it to When you leave a function When the script ends
所以也许你应该检查你的程序有多少可以封装到函数中,尽管在你的代码片段中没有太多可看的。
(1)
我建议使用prepared statements来提高效率。减少工作量是 imo 的最佳实践 - 不必要的查询解析。
所以我没有对实际性能改进的估计,尽管因为这个案例是在谈论 50 到 60 次迭代,即使是值得注意的也是最小的。
这道题完全是基于错误的前提。
首先,在任何地方使用 unset 都不会为您节省一个 CPU 周期,而是会使用它们。
再说反正没地方放unset
最后,此代码没有 真正的 性能问题。如果您遇到任何问题,您应该测量它们,检测真正的瓶颈,然后修复它,而不是四处乱找树。
您真正关心的应该是您的代码对 sql 各种注入和语法错误敞开大门,而不是虚构的性能问题。