【问题标题】:PHP Optimization: Integer instead of floatPHP 优化:整数而不是浮点数
【发布时间】:2018-07-20 14:12:01
【问题描述】:

我有一个包含大量计算、循环等的 PHP 脚本。 所以我必须优化代码,因为一个 AJAX 请求需要很长时间(例如 20 秒)。 当我查看“回声”文本(使用 json_encode 编码)时,我看到这些数字有 12 个十进制数字。我不需要这种精确度。我需要整数(或最多 3 个十进制数字)。 我可以降低计算精度以获得更好的请求时间吗?

对不起我的英语;)

【问题讨论】:

  • 降低计算精度以获得更好的请求时间?...您说的是低于微秒...如果您需要整数,可以使用 round()等
  • 您是否有任何数据库/文件访问权限,它们将是首先要查看的内容。
  • 您更有可能在代码的其他地方获得时间。你在做任何数据库连接/查询吗?除非您正在执行一些极其复杂的计算,否则它们不太可能会拖慢您的速度。
  • 我知道,只有微秒。但是我的一些函数被调用了几千次。没有数据库连接。

标签: php optimization floating-point int precision


【解决方案1】:

如果您想减少您发送的所有号码,那么您可以使用array_map 和bcdiv 来减少精度。

但是,使用array_map 将花费线性时间来完成,因此您最好将数据插入到要以bcdiv 格式发送的数组中:

$data = [0.123214, 1.21321424, 0.312321, 3.213213123]; // Lets say this is the data you are sending
$small = array_map(function($num) {
    return bcdiv($num, 1, 3); // Cut the decimal to 3 places
}, $data);

print_r($small);

输出:

Array ( [0] => 0.123 [1] => 1.213 [2] => 0.312 [3] => 3.213 )

【讨论】:

  • 如果在计算数​​字之后完成,它只会增加更多的处理。
  • 是的,我同意,这就是为什么我建议 OP 不使用 array_map 而是使用缩短的数字将数据输入到数组中:) - viabcdiv,我会更清楚虽然
【解决方案2】:

对于任何解释型语言(例如 PHP),单个操作的速度几乎没有操作数 的影响那么大。

在现代计算机上,浮点运算只比定点慢一点。同时,解释器查找和修改变量的开销是实际操作的几十倍。

如果对于整数,您需要添加类似round() 的操作数,添加它的成本可能比实际固定与浮动 CPU 指令的任何节省成本都高。

你提到了传递数字。发送更多字节(更多小数位)的网络成本也是一个因素。

这里有一些数字。警告:它们可能明显“关闭”。但它为您提供了一些比较事物的方法。所有都以纳秒为单位。

0.5 Integer add
1.0 double precision add (16 significant digits)
30 PHP overhead for either add
30 PHP time to perform virtually any simple action
200 the time to send one more byte across to/from a remote site

但是,您还需要计算它们的频率......

如果你在做矩阵算术,那么可能有成千上万的算术运算。在这种情况下,您正在查看 30ns * 一些大数字。那将是一个很大的数字。

如果您通过 AJAX 发送额外的 5 个字节,这将是小到无法测量的。

换个角度看:

  • 通过摆弄“低级”事物(例如,int 与 float),您可能会将速度提高几个百分点。
  • 通过找到更好的算法,您可以将程序速度提高一个“数量级”。

课程:着眼于大局;那里物有所值。

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2014-09-27
    • 2020-12-30
    相关资源
    最近更新 更多