2013-05-02 100 views
2

我嘗試使用以下代碼計算PHP中的歐幾里德距離,但花費的時間非常長。我想測試如果我在C中執行相同的操作,如果它會更快。輸入數據應該從php傳遞,而其他所有數據都存儲在mysql數據庫中。如何快速操作,因爲我必須計算每個具有約900個屬性的30,000個圖像的距離。那麼如何讓C中的計算速度比PHP更快?我還沒有編程在C很多,所以任何建議將不勝感激。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 
+1

這個問題是不是與語言,但算法 – 2013-05-02 06:36:57

回答

1

你的問題是不是與語言,Arash的韓國海洋研究院把它。 SQL將由您的SQL服務器執行,並且感謝所使用的算法,該服務器將成爲您的瓶頸,而不是您的腳本編寫的語言。如果切換到C,您將無法獲得任何顯着的速度,除非你也改變你的策略。

優化拇指的基本規則:

  • 不要爲你的計算中使用的數據庫。使用數據庫獲取相關數據,然後用PHP或C進行計算。

  • (預先計算的?)查找數組:分析您的數據並查看是否可以構建查詢數組 - pow()結果,而不是每次重新計算每個值。如果您有很多重複的數據,這很有幫助。

  • 避免序列化 - 您可以在您的數據的不同部分上並行運行多個腳本實例以最大化吞吐量嗎?

  • 考慮使用服務器端準備好的語句 - 它們可能會加速一點。

+0

我第一次嘗試獲取所有的DATAS,但取過程只需要更多的時間比上述sql語句,所以我認爲這是在MySQL更快。我也讀過Mysql比PHP快。我怎樣才能避免序列化?你能給一些例如。正如你所看到的,我有4個不同的表格,所以在4個表格上進行計算分別會增加性能嗎? – user1583647 2013-05-03 02:48:15

+0

他們優化的關鍵是修復算法。除此之外,其他任何東西都不會對您的表現產生巨大影響,除非您缺少基本的表格索引。你基本上想要實現什麼?爲什麼你需要快速的表現?您是否可以不等待計算一次,然後將結果存儲在數據庫表中,然後在下次需要時從中獲取計算值? – 2013-05-03 08:15:50