我尝试使用以下代码计算PHP中的欧几里德距离。但是它花费的时间很长。我想测试我是否在C中执行相同的操作,如果它会更快。输入数据应该从php传递,而所有其他数据都存储在mysql数据库中。如何快速完成操作,因为我必须计算每个具有约900个属性的30,000多个图像的距离。那么如何在C中比在PHP中更快地进行计算呢?我没有在C编程,所以任何建议都将受到高度赞赏。
PHP中用于距离计算的查询可以总结如下:
SELECT tbl_img.img_id,
tbl_img.img_path,
((pow(($r[9]-coarsewt_1),2))+(pow(($r[11]-coarsewt_2),2))+ ... +(pow(($r[31]-coarsewt_12),2))+
(pow(($r[36]-finewt_$wt1),2))+(pow(($r[38]-finewt_$wt2),2))+(pow(($r[40]-finewt_$wt3),2))+
(pow(($r[43]-shape_1),2))+(pow(($r[44]-shape_2),2))+ ... +(pow(($r[462]-shape_420),2))+
(pow(($r[465]-texture_1),2))+(pow(($r[466]-texture_2),2))+ ... +(pow(($r[883]-texture_419),2))+(pow(($r[884]-texture_420),2)))
as distance
FROM tbl_img
INNER JOIN tbl_coarsewt
ON tbl_img.img_id=tbl_coarsewt.img_id
INNER JOIN tbl_finewt
ON tbl_img.img_id=tbl_finewt.img_id
INNER JOIN tbl_shape
ON tbl_img.img_id=tbl_shape.img_id
INNER JOIN tbl_texture
ON tbl_img.img_id=tbl_texture.img_id
WHERE tbl_img.img_id>=1 AND tbl_img.img_id<=31930
ORDER BY distance ASC LIMIT 6
答案 0 :(得分:1)
你的问题不在于语言,正如Arash Kordi所说的那样。 SQL将由SQL服务器执行,并且由于使用了该算法,该服务器将成为您的瓶颈,而不是您编写脚本的语言。如果切换到C,您将无法获得任何显着的速度,除非你也改变你的策略。
优化的基本经验法则:
请勿使用数据库进行计算。使用数据库获取相关数据,然后在PHP或C中执行计算。
(预先计算?)查找数组:分析您的数据并查看是否可以构建一个查找数组 - 例如 - pow()结果,而不是每次都计算每个值。如果您有大量重复数据,这将非常有用。
避免序列化 - 您是否可以在数据的不同部分并行运行多个脚本实例以最大化吞吐量?
考虑使用服务器端预处理语句 - 它们可能会加快速度。