Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Dijkstra算法优化/缓存_Php_Caching_Optimization_Dijkstra - Fatal编程技术网

Php Dijkstra算法优化/缓存

Php Dijkstra算法优化/缓存,php,caching,optimization,dijkstra,Php,Caching,Optimization,Dijkstra,我有3个输入变量(开始、停止和时间)的Dijkstra算法。大约需要0.5-1秒才能完成。我的主机提供商说它使用了太多的资源,我应该实现一些缓存机制。我的问题是,怎么做 因为我有3个变量,如果其中只有一个变量发生变化,那么整个结果是不同的(因为我有一些随时间变化的附加语句,不管怎样)。那么,如何实现一些缓存机制或进行一些优化呢 我有1700个节点 微观优化,但不做: for ($p = 0; $p < sizeof($nextStopArray); $p++) { ... }

我有3个输入变量(开始、停止和时间)的Dijkstra算法。大约需要0.5-1秒才能完成。我的主机提供商说它使用了太多的资源,我应该实现一些缓存机制。我的问题是,怎么做

因为我有3个变量,如果其中只有一个变量发生变化,那么整个结果是不同的(因为我有一些随时间变化的附加语句,不管怎样)。那么,如何实现一些缓存机制或进行一些优化呢

我有1700个节点



微观优化,但不做:

for ($p = 0; $p < sizeof($nextStopArray); $p++) { 
   ...
}
for($p=0;$p
在循环之前计算sizeof($nextStopArray),否则每次迭代都要进行计数(并且该值不会更改)

$nextstoparaysize=sizeof($nextStopArray);
对于($p=0;$p<$nextstoparaysize;++$p){
...
}
有几个地方需要改变

如果迭代数千次,++$p比$p快++

但是配置函数。。。找出哪些部件执行时间最长,并对其进行优化

编辑

摆脱数组\u push\u键作为函数,只需内联执行它。。。否则,您将花费不必要的函数调用

从while(true)循环之外的数据库中构建所有节点的数组。。。检索单个SQL查询中的所有数据并构建查找数组

替换

for ($p = 0; $p < sizeof($nextStopArray); $p++) { 
for($p=0;$p

$nextstoparaysize=sizeof($nextStopArray);
$p=-1
而(++$p<$nextstoparaysize){
...
}
也可能会更快(只需检查逻辑是否循环了正确的次数)。

乍一看(顺便说一下,您确实应该做一些分析),罪魁祸首是您正在为每个图节点执行查询以查找其邻居:

$result=mysql_query("SELECT route_id, next_stop FROM db_stop_times WHERE stop_id = $activeNode", $connection);
如果您有1700个节点,那么这将以1000个查询的顺序出现。与其频繁地访问数据库,不如缓存这些数据库会导致类似的结果,并且只会在缓存未命中时返回数据库

它使用了太多的资源

哪种资源?(CPU?内存?网络带宽?数据库服务器上的I/O负载?)

如果我读对了,那么在每次寻路尝试中,您都会对每个节点执行数据库调用。在等待数据库响应时,这些调用都会阻塞一段时间。即使您有一个快速数据库,这也必然需要几毫秒的时间(除非数据库与您的代码运行在同一台服务器上).所以我大胆猜测,您的大部分执行时间都花在等待数据库的回复上

此外,如果数据库缺少适当的索引,则每个查询都可以进行完整的表扫描

解决方案很简单:在应用程序启动时将db_stop_时间加载到内存中,并在解析相邻节点时使用内存中的表示

< >编辑:是的,StutsID索引是这个查询的一个合适的索引。对于实际的缓存,我不知道PHP,但是用java(或者C++,或者C++,甚至C)的一些东西,我会使用表单

的表示。
class Node {
    Link[] links;
}

class Link {
    int time;
    Node destination;
}

这将比memcached快一点,但假设您可以轻松地将整个表放入主内存中。如果您不能做到这一点,我会使用memcached这样的缓存系统。

我听说过这个++p和p++但我不相信。现在我相信了:d现在这三个优化大约快了2倍。您能提到其他什么吗?有些人不相信你听到的优化是不正确的,其他人是。区分真相和谣言的唯一方法是自己测试。多年来我测试了很多方法,有些方法确实值得。我一开始只做了一次查询…结果?通常在0.01秒以下:)(不带memcached)让我们希望你的主机提供商对此感到高兴。你将使用更多的内存,但只占很小一部分时间。
$nextStopArraySize = sizeof($nextStopArray);
$p = -1
while (++$p < $nextStopArraySize) { 
   ...
}
$result=mysql_query("SELECT route_id, next_stop FROM db_stop_times WHERE stop_id = $activeNode", $connection);
while (true) {       
    $result=mysql_query("SELECT route_id, next_stop FROM db_stop_times WHERE stop_id = $activeNode", $connection);
class Node {
    Link[] links;
}

class Link {
    int time;
    Node destination;
}