rem*_*ght 7 php performance while-loop
我使用PHP来进行纬度/经度点以生成JS并在OSM Map上显示点.当我在录音中有10分钟或更长时间的暂停时,我想在地图上制作一首新曲目.
我的数据集目前在大约10个不同的轨道上有大约30000条记录(一些轨道有大约300个点,其他轨道有数千个).
我遇到了PHP的性能问题.当循环聚集了数百个点时,数据的处理速度很快,但如果轨道有数千个点,则性能会急剧下降.
以下是每个轨道的每个点所需的时间
+-----------------+------------------------------+
| Points On Track | Time To Proceed 10000 Points |
+-----------------+------------------------------+
| 21 | 0.75 |
| 18865 | 14.52 |
| 539 | 0.79 |
| 395 | 0.71 |
| 827 | 0.79 |
| 400 | 0.74 |
| 674 | 0.78 |
| 2060 | 1.01 |
| 2056 | 0.99 |
| 477 | 0.73 |
| 628 | 0.77 |
| 472 | 0.73 |
+-----------------+------------------------------+
Run Code Online (Sandbox Code Playgroud)
我们可以看到,当我在赛道上有很多分数时,表现会大幅下降.在这种特殊情况下,处理所有点需要大约30个秒.如果我将每个曲目的点数限制为500点,那么表现相当不错(我的数据集大约需要2.5秒).
我使用Synology DS415play作为网络服务器.
这是我的代码:
$dataTab = array();
if ($result = $mysqli->query($sql))
{
$count = 0;
$row = $result->fetch_array();
$data = $dataTab[$tabPrt] . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
$date = new DateTime($row['time']);
while($row = $result->fetch_array())
{
$count++;
$newDate = new DateTime($row['time']);
if(($newDate->getTimestamp() - $date->getTimestamp()) > 600)
{
array_push($dataTab, $data);
$data= "";
$count = 0;
}
$data = $data . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
$date = $newDate;
}
array_push($dataTab, $data);
}
Run Code Online (Sandbox Code Playgroud)
如果我将每首曲目限制在500点,那么表现非常好
$dataTab = array();
if ($result = $mysqli->query($sql))
{
$count = 0;
$row = $result->fetch_array();
$data = $dataTab[$tabPrt] . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
$date = new DateTime($row['time']);
while($row = $result->fetch_array())
{
$count++;
$newDate = new DateTime($row['time']);
if(($newDate->getTimestamp() - $date->getTimestamp()) > 600
|| $count > 500)
{
array_push($dataTab, $data);
$data= "";
$count = 0;
}
$data = $data . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
$date = $newDate;
}
array_push($dataTab, $data);
}
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑:我在这里提供了一个数据样本:http://109.190.92.126/tracker/gpsData.sql 慢脚本:http://109.190.92.126/tracker/map.php 通过分割每个轨道的正常执行速度(最多500分) ):http://109.190.92.126/tracker/map_split.php
谢谢
这是最终产品(它在 Heroku 上,所以要等到 dyno 启动) http://sove.herokuapp.com/gps/
该解决方案背后的想法是计算服务器端时间戳的差异,并操作数组中的数据。
该脚本在我的 MBP 上花费 0.278 秒完成,占用 15.75MB 内存,最终输出$ts是一系列路线(我总共得到 7 条)。
有很多优化,包括跳过相同的坐标点。地图上的缩放范围不正确,但您会弄清楚的。我真的应该为这份工作要求赏金......如果您喜欢结果,请告诉我,我可以分享代码库。
来源:https ://gist.github.com/jpaljasma/04f54e0d2fa3a632071e
| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |